Node의 가장 자랑스러운 점은 매우 작은 코어를 가지고 있다는 점입니다. 일부 언어에는 전체 POSIX API 바인딩이 있지만 Node는 가능한 한 적은 바인딩을 구현하고 동기, 비동기 또는 스트리밍 API를 통해 노출합니다.
이러한 접근 방식은 운영 체제에 Node.js에서 다시 빌드해야 하는 몇 가지 매우 편리한 기능이 있음을 의미합니다. 이것은 파일 시스템 패키지를 사용하는 방법을 알려주는 실용적인 튜토리얼입니다.
파일 인용
파일 시스템과 상호작용할 때 올바른 파일을 가리키는 것이 중요합니다. NPM 패키지는 상대 경로 참조를 사용하므로 경로를 하드 코딩할 수 없습니다. 패키지가 올바른 파일을 참조하는지 확인하는 두 가지 주요 방법이 있습니다.
// 使用 `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')
파일 읽기
노드에서 파일을 비동기적으로 읽는 가장 쉬운 방법은 스트림을 사용하는 것입니다! 예를 들면 다음과 같습니다.
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)
파일 생성
파일을 만드는 것은 어렵지 않습니다. 다음은 노드에 구현된 cat 명령입니다.
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')))
파일 삭제
셸 스크립트에서 삭제된 파일과 디렉터리는 일반적으로 rm-rf 명령을 사용합니다. NodeJS의 rimraf도 동일한 기능을 구현합니다.
const rimraf = require('rimraf') const path = require('path') rimraf(path.join(__dirname, './my-directory'), err => { if (err) throw err })
디렉토리 생성
파일 생성과 삭제는 mkdirp 패키지를 사용한다는 점에서 매우 유사합니다
const mkdirp = require('mkdirp') const path = require('path') mkdirp(path.join(__dirname, 'foo/bar'), err => { if (err) throw err })
파일 찾기
readdirp를 사용하여 현재 디렉터리에서 파일을 찾습니다.
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)
findup을 사용하여 현재 상위 디렉토리에서 파일을 찾으세요:
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) })
파이프에 대하여
파이프라인에서 전체 데이터 흐름의 오류를 한 번 처리하는 것은 매우 유용합니다. 각 개별 데이터 스트림에 .on('error', cb)를 사용하는 대신:
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 })