携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
前言
fs 模块是 Node.js 的内置模块,提供操作文件系统的能力,比如文件及目录的创建、写入及删除等操作。
它是一个十分基础且有用的模块。Node.js 常用作 web 服务或者工具的开发,最依赖的就是 http 和 fs 模块。
在 fs 模块中,所有的方法都有同步和异步两种实现。在很久以前 node 还不支持 Promise 的时代,异步只能通过回调的方式去使用。现在的 fs 模块已经支持使用 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 流有关的方法,会在后面讲到。