我正在从事的项目(Node.js)意味着对文件系统的大量操作(复制、读取、写入等)。

哪种方法是最快的?


当前回答

另一个答案的改进。

特点:

如果dst文件夹不存在,则会自动创建。另一个答案只会抛出错误。 它返回一个承诺,这使得它更容易在更大的项目中使用。 它允许您复制多个文件,当所有文件都被复制时,承诺就会完成。

用法:

var onePromise = copyFilePromise("src.txt", "dst.txt");
var anotherPromise = copyMultiFilePromise(new Array(new Array("src1.txt", "dst1.txt"), new Array("src2.txt", "dst2.txt")));

代码:

function copyFile(source, target, cb) {
    console.log("CopyFile", source, target);

    var ensureDirectoryExistence = function (filePath) {
        var dirname = path.dirname(filePath);
        if (fs.existsSync(dirname)) {
            return true;
        }
        ensureDirectoryExistence(dirname);
        fs.mkdirSync(dirname);
    }
    ensureDirectoryExistence(target);

    var cbCalled = false;
    var rd = fs.createReadStream(source);
    rd.on("error", function (err) {
        done(err);
    });
    var wr = fs.createWriteStream(target);
    wr.on("error", function (err) {
        done(err);
    });
    wr.on("close", function (ex) {
        done();
    });
    rd.pipe(wr);
    function done(err) {
        if (!cbCalled) {
            cb(err);
            cbCalled = true;
        }
    }
}

function copyFilePromise(source, target) {
    return new Promise(function (accept, reject) {
        copyFile(source, target, function (data) {
            if (data === undefined) {
                accept();
            } else {
                reject(data);
            }
        });
    });
}

function copyMultiFilePromise(srcTgtPairArr) {
    var copyFilePromiseArr = new Array();
    srcTgtPairArr.forEach(function (srcTgtPair) {
        copyFilePromiseArr.push(copyFilePromise(srcTgtPair[0], srcTgtPair[1]));
    });
    return Promise.all(copyFilePromiseArr);
}

其他回答

我写了一个小工具来测试不同的方法:

https://www.npmjs.com/package/copy-speed-test

运行它

npx copy-speed-test --source someFile.zip --destination someNonExistentFolder

它使用child_process.exec()进行本地复制,使用fs进行复制文件。它使用creatererestream和各种不同的缓冲区大小(您可以通过在命令行上传递它们来更改缓冲区大小)。执行NPX copy-speed-test -h查看更多信息)。

如果你不关心它是否是异步的,并且不复制千兆字节大小的文件,并且宁愿不为单个函数添加另一个依赖项:

function copySync(src, dest) {
  var data = fs.readFileSync(src);
  fs.writeFileSync(dest, data);
}

Mike Schilling的错误处理解决方案,为错误事件处理程序提供了一个快捷方式。

function copyFile(source, target, cb) {
  var cbCalled = false;

  var rd = fs.createReadStream(source);
  rd.on("error", done);

  var wr = fs.createWriteStream(target);
  wr.on("error", done);
  wr.on("close", function(ex) {
    done();
  });
  rd.pipe(wr);

  function done(err) {
    if (!cbCalled) {
      cb(err);
      cbCalled = true;
    }
  }
}

您可能想要使用async/await,因为节点v10.0.0可以使用内置的fs Promises API。

例子:

const fs = require('fs')

const copyFile = async (src, dest) => {
  await fs.promises.copyFile(src, dest)
}

注意:

从节点v11.14.0到v10.17.0, API不再是实验性的。

更多信息:

承诺API

承诺拷贝文件

   const fs = require("fs");
   fs.copyFileSync("filepath1", "filepath2"); //fs.copyFileSync("file1.txt", "file2.txt");

这是我个人用来复制一个文件和替换另一个文件使用Node.js:)