45 # 实现文件拷贝功能

下面实现边读边写的文件拷贝功能,这样不会淹没系统的可用内存,合理读写

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,添加内容:

人生的意义,在于承担人生无意义的勇气。如果你一直在找人生的意义,你永远不会生活。

执行上面代码,我们就能进行文件的拷贝

45 # 实现文件拷贝功能_第1张图片

你可能感兴趣的:(Node,/,Node,框架,前端工程架构,fs)