带有节点的copyFile偶尔只复制文件的一部分
copyFile with node occasionally only copies part of file
我正在尝试构建一个文件观察器,它会在最终使用 chokidar
添加文件时复制文件。这些文件有不同的大小,但范围在 200MB 到 1GB 之间。
watch(`${inputFolder}/*/**`, {
ignoreInitial: false,
awaitWriteFinish: true,
}).on("add", (path) => {
handleFileAdded(path);
retryFailedPaths();
});
我遇到了一个奇怪的问题,一些文件只被复制了一部分,然后没有任何错误地保留在那里。目标大小不同并且不是恒定的。我感觉这个过程不知何故被某些东西打断了。奇怪的是,(损坏的)复制后的代码愉快地继续,在这种情况下删除源文件。
fs.copyFileSync(sourcePath, newPath, fs.constants.COPYFILE_FICLONE);
fs.unlinkSync(sourcePath);
由此我得出结论,进程本身没有被终止。我还观察到 chokidar
比以前的文件可以复制的速度更快,但我认为这不是问题,因为这些文件彼此无关。
我尝试了 fs.copySync
和 fs.promises.copy
,两者的行为相同。我无法在本地重现,很可能是因为我的计算机比目标环境快。我还查看了目标设备上的资源使用情况,但它从未达到 RAM 和 CPU 方面的上限。在目标设备上,文件正在从一个硬盘驱动器复制到另一个硬盘驱动器。
这里有一些额外的信息:
环境:docker
运行时间:node14:alpine
解决方法很简单。该文件在完全写入磁盘之前由 chokidar
添加和注册。这样,只要 chokidar
.
注册了新的“更新”,copyFileSync 就会覆盖目标文件
我正在尝试构建一个文件观察器,它会在最终使用 chokidar
添加文件时复制文件。这些文件有不同的大小,但范围在 200MB 到 1GB 之间。
watch(`${inputFolder}/*/**`, {
ignoreInitial: false,
awaitWriteFinish: true,
}).on("add", (path) => {
handleFileAdded(path);
retryFailedPaths();
});
我遇到了一个奇怪的问题,一些文件只被复制了一部分,然后没有任何错误地保留在那里。目标大小不同并且不是恒定的。我感觉这个过程不知何故被某些东西打断了。奇怪的是,(损坏的)复制后的代码愉快地继续,在这种情况下删除源文件。
fs.copyFileSync(sourcePath, newPath, fs.constants.COPYFILE_FICLONE);
fs.unlinkSync(sourcePath);
由此我得出结论,进程本身没有被终止。我还观察到 chokidar
比以前的文件可以复制的速度更快,但我认为这不是问题,因为这些文件彼此无关。
我尝试了 fs.copySync
和 fs.promises.copy
,两者的行为相同。我无法在本地重现,很可能是因为我的计算机比目标环境快。我还查看了目标设备上的资源使用情况,但它从未达到 RAM 和 CPU 方面的上限。在目标设备上,文件正在从一个硬盘驱动器复制到另一个硬盘驱动器。
这里有一些额外的信息:
环境:docker
运行时间:node14:alpine
解决方法很简单。该文件在完全写入磁盘之前由 chokidar
添加和注册。这样,只要 chokidar
.