Ce dont Node est le plus fier, c'est qu'il a un très petit noyau. Alors que certains langages disposent de liaisons API POSIX complètes, Node implémente le moins de liaisons possible et les expose via des API synchrones, asynchrones ou en streaming.
Cette approche signifie que certaines fonctionnalités très pratiques du système d'exploitation doivent être reconstruites dans Node. Il s'agit d'un didacticiel pratique qui vous apprend à utiliser les packages du système de fichiers.
Citer des fichiers
Il est important lors de l'interaction avec le système de fichiers de pointer vers le bon fichier. Étant donné que les packages NPM utilisent des références de chemin relatif, vous ne pouvez pas coder en dur le chemin. Il existe deux manières principales de garantir que les packages référencent les bons fichiers :
// 使用 `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')
Lire le fichier
Le moyen le plus simple de lire des fichiers de manière asynchrone dans Node est d'utiliser des flux ! Voici un exemple :
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)
Créer un fichier
Créer des fichiers n'est pas difficile. Voici une commande cat implémentée dans node :
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')))
Supprimer des fichiers
Les fichiers et répertoires supprimés dans les scripts shell utilisent généralement la commande rm-rf. Un rimraf dans NodeJS implémente également la même fonction :
const rimraf = require('rimraf') const path = require('path') rimraf(path.join(__dirname, './my-directory'), err => { if (err) throw err })
Créer un répertoire
La création et la suppression de fichiers sont très similaires, en utilisant le package mkdirp
const mkdirp = require('mkdirp') const path = require('path') mkdirp(path.join(__dirname, 'foo/bar'), err => { if (err) throw err })
Rechercher des fichiers
Utilisez readdirp pour rechercher des fichiers dans le répertoire actuel :
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)
Utilisez findup pour rechercher des fichiers dans le répertoire parent actuel :
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) })
À propos des tuyaux
Il est très utile de gérer les erreurs de l'ensemble du flux de données une fois dans le pipeline. Au lieu d'utiliser .on('error', cb) pour chaque flux de données individuel :
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 })