带有节点的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.copySyncfs.promises.copy,两者的行为相同。我无法在本地重现,很可能是因为我的计算机比目标环境快。我还查看了目标设备上的资源使用情况,但它从未达到 RAM 和 CPU 方面的上限。在目标设备上,文件正在从一个硬盘驱动器复制到另一个硬盘驱动器。

这里有一些额外的信息:

环境:docker

运行时间:node14:alpine

解决方法很简单。该文件在完全写入磁盘之前由 chokidar 添加和注册。这样,只要 chokidar.

注册了新的“更新”,copyFileSync 就会覆盖目标文件