javascript - 减少使用 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 次写入操作并等待它完成可能不是最好的主意。
我的问题是:
- 使用NodeJS进行这样的文件夹复制操作的正确方法是什么?
- 为什么 Windows 复制操作比 NodeJS 复制操作快这么多?
- 如何减少文件夹的复制时间?是否有一些我可能缺少的本机 Electron API?
我不是这方面的专家,所以如果您的回答有一些我可以查看的资料或一些详细的解释,我将不胜感激。
解决方案
感谢上面的评论,我得到了解决方案。我在 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;
出于某种原因,第一个副本给出了错误的结束代码,但副本完成得很好
推荐阅读
- c - 在 C 中实现类
- macos - macOS 如何为进程分配堆栈和堆?
- reactjs - 获取后无法访问状态数组
- java - 仅使用不带 ArrayList 的 Random 写入不重复的随机数
- java - 运行这个 java 游戏循环代码来渲染图形正在扼杀性能
- docker - 为什么 docker system prune 没有删除悬空图像,而 docker rmi $(docker images --filter "dangling=true" -q --no-trunc) 没有
- c# - 仅用于一个控制器的 Web API 缓存 DLL 和符号文件
- java - 流的收集功能中组合器的用途是什么?
- r - 如何让 R 代码等待后台 R 会话完成?
- javascript - 模态关闭后停止 jQuery 函数