Python 为什么在windows上写入现有文件时,即使在文件关闭后,电源故障也会导致数据丢失?

Python 为什么在windows上写入现有文件时,即使在文件关闭后,电源故障也会导致数据丢失?,python,ntfs,robocopy,hard-drive,fault-tolerance,Python,Ntfs,Robocopy,Hard Drive,Fault Tolerance,我使用robocopy将网络上的目录镜像到机器上。目标机器容易断电。有好几次我发现,在成功的robocopy之后,有些文件的大小/日期是正确的,但都是空的(都是NUL字节) Robocopy通过以下方式复制文件: 在目标中创建文件 将其mod time设置为epoch 设置文件的大小 将实际字节写入文件 设置mod/create时间以匹配源 所以我得到的文件就像1-3和5发生了一样,但4没有发生。Robocopy使用mod dates来决定更新哪些文件,因此在Robocopy运行期间因断电而“损

我使用robocopy将网络上的目录镜像到机器上。目标机器容易断电。有好几次我发现,在成功的robocopy之后,有些文件的大小/日期是正确的,但都是空的(都是NUL字节)

Robocopy通过以下方式复制文件:

  • 在目标中创建文件
  • 将其mod time设置为epoch
  • 设置文件的大小
  • 将实际字节写入文件
  • 设置mod/create时间以匹配源
  • 所以我得到的文件就像1-3和5发生了一样,但4没有发生。Robocopy使用mod dates来决定更新哪些文件,因此在Robocopy运行期间因断电而“损坏”的文件不会在以后成功运行Robocopy时得到修复

    出于好奇,我在没有机器人的情况下大规模复制了这种行为。运行此python代码并在大约30000个文件后使用power会产生有趣的结果:

    for i in range(100000):
        if i and i%1000 == 0:
            print(i)
        with open(str(i),'wb') as f:
            f.truncate(5)
        with open(str(i),'r+') as f:
            f.write('ccccc')
    
    断电和重启后,我检查了写入的文件。数千个大小合适,但有NUL内容。如果省略第一个文件open/truncate,则所有文件都具有正确的内容

    你知道这是怎么回事吗?禁用驱动器上的写缓存没有帮助。同样的问题在写入新文件时不会发生,这一事实也令人困惑


    这种行为使得robocopy在断电情况下毫无用处。即使在robocopy完全完成后不久断电也会导致断电。

    我尝试在我的robocopy中添加/J,它使用无缓冲IO(目标创建文件调用使用file\u FLAG\u NO\u缓冲)。这会让事情变得更好(只有少数文件的内容过时,但更新了多次),但并不能完全解决问题。