我正在运行一个.bat,其中包含:
robocopy \\server\directory\ .\localdir /MIR
这会将单个文件从服务器移到我的本地目录。
这是一个大文件,需要一段时间才能完成,但是我可以使用该位置的文件的现有副本来实现所需的功能。
到底什么时候文件会被覆盖?我可以在其中运行^ C并使用.bat开始运行之前\ localdir中的文件吗?还是我需要等待自动复制完成?
我正在运行一个.bat,其中包含:
robocopy \\server\directory\ .\localdir /MIR
这会将单个文件从服务器移到我的本地目录。
这是一个大文件,需要一段时间才能完成,但是我可以使用该位置的文件的现有副本来实现所需的功能。
到底什么时候文件会被覆盖?我可以在其中运行^ C并使用.bat开始运行之前\ localdir中的文件吗?还是我需要等待自动复制完成?
Answers:
robocopy
与任何其他文件复制程序没有什么不同。覆盖副本会“截断”文件中的现有数据,然后开始写入新数据。您可以通过监视robocopy调用的系统API的程序来观察此情况,例如此处列出的选项之一。然后,您只需要在MSDN上查找每个API调用即可准确了解正在发生的情况。
首先,它调用SetFilePointerEx来查找文件的开头(如果尚不存在)。然后,它调用SetEndOfFile将文件截断为BOF标记(使其成为零字节文件)。这一切发生得如此之快,以至于该命令开始执行后,所有目的和用途都将“丢失”原始文件数据(表示文件数据流的块很快就会被将来的NTFS写入全部或部分覆盖)命令)。
如果要“原子地”执行此操作,则可以执行重命名操作,如下所示:
将文件内容(使用robocopy)从服务器复制到本地系统上当前不存在的唯一路径名(例如,如果文件名为,则可以将其复制到。)foo
foo.bak
使用Windows Vista中添加的原子重命名Windows API函数进行覆盖重命名(因此在XP和更早版本中不受支持,这要求使用非原子的,可能有错误的或损坏的,非原子的重命名;哎哟):MoveFileTransacted()。这样,您可以立即“交换”出文件中包含的数据,从原始文件的内容到新文件的内容。这意味着任何程序都不可能读取部分完成的文件 -要么读取(完整的,未更改的)原始副本,要么读取完整的,未更改的更新副本。它永远不会读取两个文件的“不完整”副本或乱码。
这种替代方法的缺点是: