Buffer Stream fs 模块的关系。
前言
fs
模块是 Node.js 的内置模块,提供操作文件系统的能力,比如文件及目录的创建、写入及删除等操作。
它是一个十分基础和有用的模块。Node.js 常用作 web 服务或者工具的开发,最依赖的就是 http 和 fs 模块。
在 fs
模块中,所有的方法都分为同步和异步两种实现。在很久以前,node 还不支持 Promise 的时代,异步只能通过回调的方式去使用。
文件读写操作
准备一个文件:
// 1.txt
昆吾kw
fs.readFile(path [, options], callback)
读取文件。
const fs = require('fs')
// fs 模块的 Promise 实现
const fsp = require('fs/promises')
// 同步的形式读取
let res = fs.readFileSync('./1.txt')
// 如果不指定 encoding 编码格式,默认以 buffer 格式读取
console.log(res) // <Buffer e6 98 86 e5 90 be 6b 77>
// 回调的形式读取
// encoding:utf8 utf-8皆可
fs.readFile('./1.txt', { encoding: 'utf8' }, (err, res) => {
if (err) {
return console.log(err)
}
console.log(res)
})
// Promise 形式读取
fsp.readFile('1.txt', { encoding: 'utf8' }).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
// 输出:昆吾kw
fs.writeFile(file, data[, options], callback)
写入文件。
// 若文件不存在会自动创建文件
fsp.writeFile('2.txt', 'hello').then(() => {
// 写入成功没有结果
}).catch(err => {
console.log(err)
})
fs.copyFile( src, dest, mode, callback )
拷贝文件。
fs.copyFile('1.txt', '3.txt', (err) => {
if (err) {
return console.log(err);
}
});
文件夹的操作
fs.mkdir(path[, mode], callback)
创建目录。
fs.mkdir('src', err => {
console.log(err);
});
fs.readdir(path[, options], callback)
读取目录下的所有文件和目录。
fs.readdir('./', (err, res) => {
if (err) {
return console.log(err);
}
console.log(res)
})
// [ '1.txt', '2.txt', '3.txt', 'index.js', 'src' ]
fs.stat(path, callback)
查看文件或者目录信息。
fs.statSync('2.txt').isFile(); // true
fsp.stat('1.txt').then(res => {
// 该 API 返回一个 Stats 对象,可以读取文件或目录的一些状态属性
console.log(res)
console.log(res.isFile()) // true
})
fsp.stat('src').then(res => {
console.log(res.isDirectory()) // true
})
fs.rename(oldPath, newPath, callback)
文件和目录的重命名。也可以用作文件或者目录的移动。
fs.rename('4.txt', '5.txt', (err) => {
console.log(err)
})
fs.rename('abc', 'abc2', (err) => {
console.log(err)
})
fs.unlink()
只能用来删除文件。
fs.unlink('5.txt', (err) => {
console.log(err)
})
fs.rm()
可递归删除文件和目录。
fs.rm('5.txt', (err) => {
console.log(err)
})
fs.rmdir()
删除目录。
fs.rmdir('abc2', (err) => {
console.log(err)
})
文件描述符 flags
在读写文件时,通过可选的 flags 参数来指定一些行为。比如:
fs.writeFile('./1.txt', 'kw', {flag:'a'},function(){
console.log('ok');
});
flag
默认为 w
,如果原来的文件有内容,则会覆盖掉。设置为 a
,表示会在原始内容上追加内容。
符号 | 含义 |
---|---|
r | 读文件,文件不存在报错 |
r+ | 读取并写入,文件不存在报错 |
rs | 同步读取文件并忽略缓存 |
w | 写入文件,不存在则创建,存在则清空 |
wx | 排它写入文件 |
w+ | 读取并写入文件,不存在则创建,存在则清空 |
wx+ | 和w+类似,排他方式打开 |
a | 追加写入 |
ax | 与a类似,排他方式写入 |
a+ | 读取并追加写入,不存在则创建 |
ax+ | 作用与a+类似,但是以排他方式打开文件 |
各个描述符的基本含义:
- r 读取
- w 写入
- s 同步
- + 增加相反操作
- x 排他方式
r+ w+的区别?
- 当文件不存在时,r+不会创建,而会导致调用失败,但w+会创建。
- 如果文件存在,r+不会自动清空文件,但w+会自动把已有文件的内容清空。
小结
本文总结了 fs
模块的一些常用方法。fs
模块大概有100多个方法,非常多,常用的大概就是文中总结的这些。还有一些和 Stream
有关的方法,会在后面讲到。