Node文件操作汇总实例详解
前言
前两天我们介绍了 Nodejs 中 I/O 的重要组成部分:Buffer对象
和 Stream流
,今天我们介绍 Nodejs 的文件系统,包括文件和目录的读写、删除,以及监听文件和目录的修改。
文件系统
Nodejs 内置的 fs模块
可与文件系统进行交互,封装了常规的 POSIX函数
。POSIX(Portable Operating System Interface,可移植操作系统接口)是UNIX系统的一个设计标准。fs模块提供了多个操作目录和文件的方法,大多会有同步和异步两种版本。同步的方法名称会以Sync为后缀。
目录处理
fs模块的 readdir()
方法可异步的读取目录内容。回调函数包含两个参数,第一个是错误对象,第二个是一个包含文件名称的数组,对应的同步方法是 readdirSync()
。在下面的示例中,当前目录包含两个文件,上一级目录包含一个目录名称。
const fs = require('fs');
fs.readdir('./', (err, files) => {
console.log(files); //[ 'demo.txt', 'index.js' ]
});
fs.readdir('../', (err, files) => {
console.log(files); //[ '1' ]
});
其它处理目录的方法还有 opendir()
、mkdir()
等。
读写文件
在fs模块中,可使用批量方法 readFile()
将文件内容一次性的加载到内存中,如下所示。
const fs = require('fs');
fs.readFile('./origin.txt', (err, buf) => {
console.log(buf.toString()); //"hello Node.js"
});
对应的写入方法是 writeFile()
,如下所示。
fs.writeFile('./target.txt', 'hello Node.js', (err) => {
if (err) throw err;
console.log('文件已被保存');
});
? 文件路径、写入内容和回调函数是必传的参数。如果文件不存在,那么会自动创建。
当文件很大时,该方法会因V8内存不足而出现问题。此时可以改用之前提到的流式方法 createReadStream()
,分批次的读取文件。
如下所示,每次只读7个字节的内容。
const readable = fs.createReadStream('./origin.txt', {highWaterMark: 7});
readable.on("data", (chunk) => {
console.log(chunk.toString());
});
通过管道方法 pipe()
将 origin.txt
中的内容写入到 target.txt
中,如下所示,对于不存在的文件,也会自动创建。
const writable = fs.createWriteStream('./target.txt');
readable.pipe(writable);
文件描述
fs模块的 stat()
方法可读取文件的描述信息,如下所示。
fs.stat('./demo.txt', (err, stats) => {
console.log(stats);
});
回调函数中的stats参数是一个 fs.Stats对象
,其属性如下所示。它还包含一些判断方法,例如isDirectory()、isFile()等。
Stats {
dev: 195650,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: undefined,
ino: 36873221949682120,
size: 13,
blocks: undefined,
atimeMs: 1586227933993.0217,
mtimeMs: 1585882949091.0166,
ctimeMs: 1586227933995.0222,
birthtimeMs: 1586227933993.0217,
atime: 2020-04-07T02:52:13.993Z,
mtime: 2020-04-03T03:02:29.091Z,
ctime: 2020-04-07T02:52:13.995Z,
birthtime: 2020-04-07T02:52:13.993Z
}
fs模块还提供了 fstat()
方法,在功能上与 stat() 等价,只是 fstat() 方法的第一个参数是文件描述符。在POSIX系统中,文件描述符是一个正整数,它实际上是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当打开或创建一个文件时,就会被分配一个文件描述符。
在下面的示例中,open()
方法的回调函数中包含一个 fd参数(即文件描述符)
,搭配 fstat() 方法就能读取文件信息:
fs.open('./demo.txt', 'r', (err, fd) => {
fs.fstat(fd, (err, stats) => {
console.log(stats);
});
});
监控文件
fs模块提供了两种方法来监控文件:watch()
和 watchFile()
,前者能监控文件或目录的更改,后者只能监控文件的更改。
watch()
方法的监听器回调包含两个参数,第一个是事件类型(包括rename和change),第二个是触发事件的文件名称,如下所示:
fs.watch('./demo.txt', (eventType, filename) => {
console.log(eventType, filename);
});
执行node命令后,每次更改demo.txt文件,就会在控制台打印出下面这条语句。
$ node index.js
change demo.txt
虽然 watch()
方法的性能优于 watchFile()
方法,但是 watch()
不是一个跨平台的方法,其表现在各个平台中并非百分百一致(例如filename参数不能保证提供),而 watchFile()
是跨平台的。
异步文件
fs.promises
是 Nodejs 提供的一组备用的异步文件系统方法,它们会返回Promise对象而不是通过回调来处理结果。例如以Promise的方式使用 stat()
方法,如下所示。
const fsPromises = require('fs').promises;
fsPromises.stat('./demo.txt').then(stats => {
console.log(stats);
});
删除文件
Nodejs 中 fs模块
提供了 unlink()
和 rm()
两个方法来删除文件。下面的代码实现了删除当前文件夹下的 toBeDel.txt
文件:
const fs = require('fs');
fs.unlink('./toBeDel.txt', (err) => {
if (!err) {
console.log(err);
}
});
// or
fs.rm('./toBeDel.txt', (err) => {
if (!err) {
console.log(err);
}
})
如果要删除文件夹,可以使用 rmdir()
方法,用法同 rm()
方法一样。
? rm()
同时支持删除目录和文件,而 unlink()
只能用于删除文件。
总结
fs模块
提供了大量对文件的操作的API,你无需去全部记住他们,只需像在学习 Linux 时简单记住那些基础的命令即可:
fs.stat
读取文件的描述信息fs.mkdir
创建目录 (创建之前先判断是否存在)fs.writeFile
写入文件(文件不存在就创建,但不能创建目录)fs.appendFile
写入追加文件fs.readFile
读取文件fs.readdir
读取目录fs.rename
重命名fs.rmdir
删除目录fs.unlink
和fs.rm
删除文件
以上就是Node文件操作汇总实例详解的详细内容,更多关于Node文件操作汇总的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341