先引用fs内置模块 const fs = require('fs');
// 异步读取文件 参数(要读的文件的路径、utf8格式、回调(data:读到的内容))
fs.readFile('./a.txt', 'utf8', (err, data) => {
console.log(data);
});
// 同步读取文件
var data = fs.readFileSync('./a.txt', 'utf8');
console.log(data);
// 异步写文件 参数(要写的文件路径、写的内容、回调 )
fs.writeFile('a.txt', '我是异步啊!', err => {
})
// 同步写文件
var data = fs.writeFileSync('a.txt', '我是同步啊!');
console.log(data);
// 异步追加一个文件 参数(要追加的文件路径、写的内容、回调 )
fs.appendFile('a.txt', ',', err => {
});
// 同步追加一个文件
fs.appendFileSync('a.txt', 'Im fine!');
// 异步复制文件内容 参数(要复制的文件路径、被复制的文件路径、回调 )
fs.copyFile('./a.txt', './b.txt', err => {
});
// 同步复制文件
fs.copyFileSync('./a.txt', './b.txt');
使用fs.read读文件
先介绍fs.open。
fs.open(path,flags,[mode],callback)方法用于打开文件,以便fs.read()读取。
参数说明:
- path 文件路径
- flags打开文件的方式
- [mode] 是文件的权限(可行参数,默认值是0666)
- callback 回调函数
flags值及说明如下
r :读取文件,文件不存在时报错;
r+ :读取并写入文件,文件不存在时报错;
rs :以同步方式读取文件,文件不存在时报错;
rs+ :以同步方式读取并写入文件,文件不存在时报错;
w :写入文件,文件不存在则创建,存在则清空;
wx :和w一样,但是文件存在时会报错;
w+ :读取并写入文件,文件不存在则创建,存在则清空;
wx+ :和w+一样,但是文件存在时会报错;
a :以追加方式写入文件,文件不存在则创建;
ax :和a一样,但是文件存在时会报错;
a+ :读取并追加写入文件,文件不存在则创建;
ax+ :和a+一样,但是文件存在时会报错。
fs.read(fd,buffer,offset,length,position,callback)接收6个参数。
参数说明:
- fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
- buffer 是存放读取到的数据的Buffer对象。
- offset 指定 向buffer中存放数据的起始位置。
- length 指定 读取文件中数据的字节数。
- position 指定 在文件中读取文件内容的起始位置。
-
callback 参数如下:
err 用于抛出异常
length 从文件中读取内容的实际字节数。
buffer 被读取的缓存区对象。
fs.open('a.txt', 'r+', (err, rfd) => {
fs.open('b.txt', 'w+', (err, wfd) => {
// 读到的buff流对象 (每次读4个汉字)
let buf = Buffer.alloc(12);
// 读取内容的位置(新读取的开始位置是上一次读取的结束位置)
let rs = 0;
// 写内容的位置(写的开始位置是上一次写的结束位置)
let ws = 0;
// 先自调用一次
(function next() {
fs.read(rfd, buf, 0, 12, rs, (err, rlen, rbuf) => {
rs += rlen;
fs.write(wfd, buf, 0, 12, ws, (err, wlen, wbuf) => {
ws += wlen;
// 递归操作读写文件内容 (rlen是读取的长度,为0时,说明读完了)
rlen && next();
})
})
})();
});
});
上面这种方法的优点在于,文件的内容是一点一点的读取和写入的,可以控制读取的长度
nodejs官网还有一种简单的文件拷贝(内容是一次性写入) 如下:
file1: 被拷贝文件路径 file2:拷贝的文件路径
fs.createReadStream(file1).pipe(fs.createWriteStream(file2));