概念
- FS:File System 文件系统。
- fs 模块可以实现与硬盘的交互。例如文件的创建、删除、重命名、移动, 还有文件内容的写入、读取以及文件夹的相关操作。
写入文件
直接写入
导入 fs 模块
异步写入文件 fs.writeFile
- fs.writeFile(file, data[, options], callback)
- file 文件名(含目录,若目录或文件不存在,Node 会自动创建)。
- data 写入内容
- options 选项设置
可选
- callback 回调函数
代码
1
2
3
4
5
6
7
8const fs = require('fs');
fs.writeFile('./abc.md', '### 我是 H3\n#### 我是 H4', e => {
if (e) {
console.log('服务异常:', e);
return;
}
console.log('成功');
})同步写入 fs.writeFileSync (效率低)
1
2const fs = require('fs');
fs.writeFileSync('./abc.md', '### 我是 H3\n#### 我是 H4');
追加写入
API
- 异步:appendFile
- 同步:appendFileSync
语法
1
2fs.appendFile(file, data[, options], callback);
fs.appendFileSync(file, data);参数:与 writeFile 一样
流式写入
API:
- 创建写入流对象 ws:createWriteStream(path)
- 写入内容:ws.write()
- 关闭通道:ws.close()
优势
- 适合写入一些大文件
- 持续写入文件,例如录屏
代码
1
2
3
4
5
6
7
8const fs = require('fs');
const ws = fs.createWriteStream('./Hello.md');
ws.write('# 一级标题\n');
ws.write('## 二级标题\n');
ws.write('### 三级标题');
ws.close();
文件读取
直接读取
API
- 异步:readFile
- 同步:readFileSync
语法
1
fs.readFile(文件路径[, 配置参数], 回调函数);
回调函数:两个形参,参数一是错误对象,没有错误则为 null;参数二是读取到的内容的 Buff 对象。
代码
1
2
3
4
5
6
7
8
9const fs = require('fs');
fs.readFile('./Hello.md', (err, data) => {
if (err) {
console.log('读取失败');
return ;
}
console.log(data.toString());
})
流式读取
API
- 创建读取流对象 rs:fs.createReadStream(‘’)
- 绑定事件:rs.on(‘事件名’, ‘回调函数’)
代码
1
2
3
4
5
6
7
8
9
10
11
12const fs = require('fs');
const rs = fs.createReadStream('./img.jpg');
// 绑定 data 事件,每次读取都会执行
rs.on('data', e => {
console.log(e); // 64kb Buffer 对象
})
// 绑定 end 事件,读取结束后执行
rs.on('end', ()=> {
console.log('读取完成');
})
复制文件
直接复制
1 | const fs = require('fs'); |
流式复制 1
1 | const fs = require('fs'); |
流式复制 2
1 | const fs = require('fs'); |
区别
流式省内存,大文件优选流式。
重命名与移动
API
- 异步:fs.rename
- 同步:fs.renameSync
语法
1
fs.rename('旧路径', '新路径', 回调函数)
代码
1
2
3
4
5
6
7
8
9const fs = require('fs');
fs.rename('./Hello.md', './Abc.md', e => {
if (e) {
console.log('操作失败');
return ;
}
console.log('操作成功');
});说明
- 若新路径与旧路径在同一目录时表示重命名,反之表示移动。
- 若移动,必须保证新路径对应的目录是存在的。
文件删除
API
- 异步:fs.unlink / fs.rm
- 同步:fs.unlinkSync / fs.rmSync
语法
1
2fs.unlink('文件路径', 回调函数)
fs.rm('文件路径', 回调函数)代码
1
2
3
4
5
6
7
8
9const fs = require('fs');
fs.rm('./Hello.md', e => {
if (e) {
console.log('删除失败');
return ;
}
console.log('删除成功');
})
文件夹操作
创建文件夹
API
- 异步:fs.mkdir
- 同步:fs.mkdirSync
语法
1
fs.mkdir('目录'[, '配置参数'], 回调函数)
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19const fs = require('fs');
// 创建单个目录
fs.mkdir('./file', e => {
if (e) {
console.log('创建失败');
return ;
}
console.log('创建成功');
});
// 创建多级目录(递归)
fs.mkdir('./file/img', { recursive: true }, e => {
if (e) {
console.log('创建失败');
return ;
}
console.log('创建成功');
});
读取文件夹
API
- 异步:fs.readdir
- 同步:fs.readdirSync
语法
1
fs.readdir('目录', 回调函数);
回调函数:
- 形参一:错误对象
- 形参二:资源列表
代码
1
2
3
4
5
6
7
8
9const fs = require('fs');
fs.readdir('./', (err, data) => {
if (err) {
console.log('读取失败');
return ;
}
console.log(data); // 打印结果 [ 'file', 'index.js' ]
});
删除文件夹
API
- fs.rmdir 即将废弃
- fs.rm 推荐使用
代码
1
2
3
4
5
6
7
8
9const fs = require('fs');
fs.rm('./file', { recursive: true } , e => {
if (e) {
console.log('删除失败');
return ;
}
console.log('删除成功');
});
查看文件/文件夹信息
API
- 异步:fs.stat
- 同步:fs.statSync
代码
1
2
3
4
5
6
7
8
9
10
11const fs = require('fs');
fs.stat('./Hello.md', (err, data) => {
if (err) {
console.log('操作失败');
return ;
}
console.log(data); // 文件信息
console.log(data.isFile()); // 是否为文件
console.log(data.isDirectory());// 是否为目录
})
__dirname
- __dirname 类似于一个全局变量。
- __dirname 中存放的是当前文件所在目录绝对路径。