Robocopy在什么时候覆盖文件?


1

我正在运行一个.bat,其中包含:

robocopy \\server\directory\ .\localdir /MIR

这会将单个文件从服务器移到我的本地目录。

这是一个大文件,需要一段时间才能完成,但是我可以使用该位置的文件的现有副本来实现所需的功能。

到底什么时候文件会被覆盖?我可以在其中运行^ C并使用.bat开始运行之前\ localdir中的文件吗?还是我需要等待自动复制完成?


反对的理由是什么?是否有我找不到的现有问题或文档中有任何内容?
StuperUser

Answers:


1

robocopy与任何其他文件复制程序没有什么不同。覆盖副本会“截断”文件中的现有数据,然后开始写入新数据。您可以通过监视robocopy调用的系统API的程序来观察此情况,例如此处列出的选项之一。然后,您只需要在MSDN上查找每个API调用即可准确了解正在发生的情况。

首先,它调用SetFilePointerEx来查找文件的开头(如果尚不存在)。然后,它调用SetEndOfFile将文件截断为BOF标记(使其成为零字节文件)。这一切发生得如此之快,以至于该命令开始执行后,所有目的和用途都将“丢失”原始文件数据(表示文件数据流的块很快就会被将来的NTFS写入全部或部分覆盖)命令)。

如果要“原子地”执行此操作,则可以执行重命名操作,如下所示:

  1. 将文件内容(使用robocopy)从服务器复制到本地系统上当前存在的唯一路径名(例如,如果文件名为,则可以将其复制到。)foofoo.bak

  2. 使用Windows Vista中添加的原子重命名Windows API函数进行覆盖重命名(因此在XP和更早版本中不受支持,这要求使用非原子的,可能有错误的或损坏的,非原子的重命名;哎哟):MoveFileTransacted()。这样,您可以立即“交换”出文件中包含的数据,从原始文件的内容到新文件的内容。这意味着任何程序都不可能读取部分完成的文件 -要么读取(完整的,未更改的)原始副本,要么读取完整的,未更改的更新副本。它永远不会读取两个文件的“不完整”副本或乱码。

这种替代方法的缺点是:

  • 我不知道已经有一个开箱即用的程序。
  • 由于复制时原始文件仍在那儿,因此需要两倍的存储空间。因此,如果您打算用另一个1 GiB文件覆盖一个1 GiB文件,则您需要在本地系统上总共存储2 GiB,尽管这是暂时的。
  • 它仅适用于事务性NTFS。这意味着,如果用于事务覆盖的源文件系统或目标文件系统不是NTFS,它将无法正常工作。您仍然可以将文件从网络共享自动复制到本地系统,但是原子重命名将无法在网络共享上运行,或者(除非将来添加)在ReFS上,这有一天可能成为我们的默认文件系统,例如NTFS在FAT32年前就已经完成了。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.