Worauf Node am meisten stolz ist, ist, dass es einen sehr kleinen Kern hat. Während einige Sprachen über vollständige POSIX-API-Bindungen verfügen, implementiert Node so wenige Bindungen wie möglich und stellt sie über synchrone, asynchrone oder Streaming-APIs bereit.
Dieser Ansatz bedeutet, dass es einige sehr praktische Funktionen im Betriebssystem gibt, die in Node neu erstellt werden müssen. Dies ist ein praktisches Tutorial, das Ihnen die Verwendung von Dateisystempaketen beibringt.
Dateien zitieren
Bei der Interaktion mit dem Dateisystem ist es wichtig, auf die richtige Datei zu verweisen. Da NPM-Pakete relative Pfadverweise verwenden, können Sie den Pfad nicht fest codieren. Es gibt zwei Hauptmethoden, um sicherzustellen, dass Pakete auf die richtigen Dateien verweisen:
// 使用 `path.join()` 而不是 `+` 确保Windows也能正常工作 const path = require('path') // 找到基于调用点的相对路径,对于命令行程序(CLI applications)非常实用 path.join(process.cwd(), 'my-dynamic-file') // 或者 path.resolve('my-dynamic-file') // 基于一个文件找到另外一个文件 path.join(__dirname, 'my-package-file')
Datei lesen
Der einfachste Weg, Dateien asynchron im Knoten zu lesen, ist die Verwendung von Streams! Hier ist ein Beispiel:
const path = require('path') const fs = require('fs') // read a file and pipe it to the console fs.createReadStream(path.join(__dirname, 'my-file')) .pipe(process.stdout)
Datei erstellen
Das Erstellen von Dateien ist nicht schwierig. Hier ist ein im Knoten implementierter Cat-Befehl:
const path = require('path') const fs = require('fs') // cat ./my-file > ./my-other-file fs.createReadStream(path.join(__dirname, 'my-file')) .pipe(fs.createWriteStream(path.join(__dirname, './my-other-file')))
Dateien löschen
Dateien und Verzeichnisse, die in Shell-Skripten gelöscht werden, verwenden normalerweise den Befehl rm-rf. Ein Rimraf in NodeJS implementiert ebenfalls dieselbe Funktion:
const rimraf = require('rimraf') const path = require('path') rimraf(path.join(__dirname, './my-directory'), err => { if (err) throw err })
Verzeichnis erstellen
Das Erstellen und Löschen von Dateien ist mit dem mkdirp-Paket sehr ähnlich
const mkdirp = require('mkdirp') const path = require('path') mkdirp(path.join(__dirname, 'foo/bar'), err => { if (err) throw err })
Dateien suchen
Verwenden Sie readdirp, um Dateien im aktuellen Verzeichnis zu finden:
const readdirp = require('readdirp') const json = require('JSONStream') const path = require('path') // recursively print out all files in all subdirectories // to the command line. The object stream must be // stringified before being passed to `stdout`. readdirp({ root: path.join(__dirname) }) .pipe(json.stringify()) .pipe(process.stdout)
Verwenden Sie findup, um Dateien im aktuellen übergeordneten Verzeichnis zu finden:
const findup = require('findup') const path = require('path') // recurse up all files relative to __dirname and find // all `package.json` files. findup(path.join(__dirname), 'package.json', (err, res) => { if (err) throw err console.log('dir is: ' + res) })
Über Rohre
Es ist sehr nützlich, Fehler des gesamten Datenflusses einmal in der Pipeline zu behandeln. Anstatt .on('error', cb) für jeden einzelnen Datenstrom zu verwenden:
const pump = require('pump') const fs = require('fs') // oh no, no errors are handled! fs.createReadStream('./in.file').pipe(fs.createWriteStream('./out.file')) // that's better, we're handing errors now const rs = fs.createReadStream('./in.file') const ws = fs.createWriteStream('./out.file') pump(rs, ws, err => { if (err) throw err })