下面实现边读边写的文件拷贝功能,这样不会淹没系统的可用内存,合理读写
const fs = require("fs");
const path = require("path");
function copy(source, target, callback) {
const SIZE = 3;
const buffer = Buffer.alloc(SIZE);
let readOffset = 0;
let writeOffset = 0;
// rfd 这个是文件描述符,是一个数字,是 Linux 规定的,windows 是从 3 开始
fs.open(source, "r", (err, rfd) => {
if (err) return callback(err);
// wfd 是写文件的描述符
fs.open(target, "w", (err, wfd) => {
if (err) return callback(err);
// 异步迭代需要 next,写完之后继续执行相同的逻辑
const next = () => {
// bytesRead 读取到的个数
fs.read(rfd, buffer, 0, SIZE, readOffset, (err, bytesRead) => {
if (err) return callback(err);
// 更改读取偏移量
readOffset += bytesRead;
// 读取到几个就往文件中添加几个
fs.write(
wfd,
buffer,
0,
bytesRead,
writeOffset,
(err, written) => {
if (err) return callback(err);
// 更改写入偏移量
writeOffset += written;
// 判断是否需要继续下一步读取
if (bytesRead == SIZE) {
next();
} else {
// 完成后的操作
fs.close(rfd);
fs.close(wfd);
callback();
}
}
);
});
};
next();
});
});
}
copy(
path.resolve(__dirname, "./45/name.txt"),
path.resolve(__dirname, "./45/copy.txt"),
(err) => {
if (err) throw err;
console.log("拷贝成功");
}
);
新建一个文件 name.txt
,添加内容:
人生的意义,在于承担人生无意义的勇气。如果你一直在找人生的意义,你永远不会生活。
执行上面代码,我们就能进行文件的拷贝