Node.js 本地文件操作实用指南
本文介绍 Node.js 中本地文件系统的常用操作方法。涵盖使用 path 模块处理相对路径、通过 fs 模块进行文件读写、利用 rimraf 和 mkdirp 处理目录删除与创建,以及使用 pump 模块安全处理数据流管道错误。适合需要掌握 Node.js 基础文件交互的开发者参考。
Node.js 文件操作基础
Node.js 的核心优势在于其极简的设计。与某些直接绑定完整 POSIX API 的语言不同,Node.js 仅实现了必要的底层绑定,并通过同步、异步或流式 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')
文件读取与创建
在 Node.js 中异步读取文件最简单的方法是使用流(Stream)。以下是一个示例:
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)
创建文件同样并不复杂,这里展示了一个使用 Node.js 实现的类似 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')))
目录与文件的删除及创建
在 Shell 脚本中,删除文件和目录通常使用 rm -rf 命令。在 Node.js 中,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)
})
管道错误处理
关于管道(Pipes)的处理
在处理整个数据流的错误时,一次性处理比单独对每个数据流使用 .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
})
Node.js 安装配置与第一个 HTTP 服务器编写
2026-11-05 11:41:40
怎么使用 nvm 管理并平滑升级 Node.js 版本
2026-11-04 23:15:07
Node.js 怎么使用 zlib 模块解压 gzip 和 deflate
2026-11-03 23:40:50
直接覆盖安装还是用版本管理器?Node.js 升级方式对比
2026-11-03 22:59:07
Express.js 是什么:Node.js Web 框架核心概念与适用场景
2026-11-03 20:00:12
