首页 > 解决方案 > 减少使用 NodeJs 复制文件夹的时间

问题描述

我目前有一个文件夹,其中包含两个子文件夹和大约 500 个文件,总计约 3GB。在我的 Electron 应用程序中,我通过 NodeJS 将其复制并粘贴到不同的驱动器来执行该文件夹的备份。但是,当我通过 Windows 复制和粘贴时,这个过程大约需要 3 分钟,而当我使用 NodeJS 时,大约需要 15 分钟。

我正在使用fs-extra复制整个文件夹:

      const path = require('path');
      const fs = require('fs-extra');
      
      var source = 'some/source/directory'
      var destination = path.join('my/backup/directory','name_of_folder_after_backup')
    
      // copy source folder to destination
      await fs.copy(source, destination);

我确实考虑过使它成为一个异步操作,fs.writeFile()但考虑到它在最坏的情况下在 HDD 上运行,我认为触发 500 次写入操作并等待它完成可能不是最好的主意。

我的问题是:

  1. 使用NodeJS进行这样的文件夹复制操作的正确方法是什么?
  2. 为什么 Windows 复制操作比 NodeJS 复制操作快这么多?
  3. 如何减少文件夹的复制时间?是否有一些我可能缺少的本机 Electron API?

我不是这方面的专家,所以如果您的回答有一些我可以查看的资料或一些详细的解释,我将不胜感激。

标签: javascriptnode.jselectron

解决方案


感谢上面的评论,我得到了解决方案。我在 Windows 上使用 robocopy 进行复制。Node 生成一个子进程,启动 Robocopy,将其包装在一个 Promise 中,然后等待它。

    const path = require("path");
    const util = require("util");
    const exec = util.promisify(require("child_process").exec);
    const source = 'your/source/dir/here';
    const destination = path.join('temp', "PDES-Backup");
    // copy source folder to destination
    //await fs.copySync(source, destination);
    const copyCommand = `Robocopy "${source}" "${destination}" /MIR /LOG:backuplog-${new Date()
      .toISOString()
      .substr(0, 10)}-${new Date().getTime()}.txt`;
    const promise = exec(copyCommand, { stdio: "inherit" });
    const child = promise.child;
    child.stdout.on("data", (data) => {
      console.log("stdout: " + data);
    });
    child.stderr.on("data", (data) => {
      console.log("stderr: " + data);
    });
    child.on("error", (error) => {
      console.error(error);
    });
    child.on("close", (code) => {
      console.warn("closing code: " + code);
    });
    // i.e. can then await for promisified exec call to complete
    const { stdout, stderr } = await promise;

出于某种原因,第一个副本给出了错误的结束代码,但副本完成得很好


推荐阅读