XCOPY 文件验证在符号链接上失败,但 diff 现在显示文件之间的差异

XCOPY 文件验证在符号链接上失败,但 diff 现在显示文件之间的差异

我正在xcopy使用以下命令行在 Windows 上执行磁盘备份:

xcopy "d:\" "r:\" /v /h /k /e /b /d

我知道验证开关虽然没有做太多的事情,但是对于初始副本来说,文件大小比较总比什么都没有要好。

我遇到的问题是xcopy抛出文件验证错误,但我不知道为什么。有问题的文件是一个符号链接,它指向的文件已经存在。

我有 Cygwin,并且在两个链接上以及两个磁盘上它指向的实际文件上运行了、和,没有任何区别diffdiff --no-dereferencecmp

两个文件正好是 73 字节。

我无法通过创建具有有效或无效链接的测试文件夹并使用xcopy相同的选项在相同或不同的磁盘上执行复制来重现此问题。

为什么会xcopy这样失败呢?

答案1

Xcopy 在复制符号链接时不会记录文件大小,但验证过程不知道符号链接并尝试将目标文件的大小与(未设置的)记录进行比较。

这可以通过 Sysinternals 观察到进程监控。最明智的做法是一次只复制一个文件,并且只xcopy.exe在 Xcopy 询问您目标是否是目录之后但在您回答之前才开始从进程中捕获文件 IO 事件——这样,您就跳过了所有进程启动 IO。/B传递时,Xcopy 在打开源文件的操作中设置“打开重新解析点”选项CreateFile,告诉 Windows,如果文件是符号链接(重新解析点),它希望打开符号链接本身而不是目标文件。稍后,在创建目标文件、将其设置为符号链接并重新排列一些文件属性后,/V传递了 if ,Xcopy 会发出另一个CreateFile命令再次打开目标文件,但没有“打开重新解析点”选项。如果这是一个符号链接,结果就是REPARSEWindows 实际上会在紧接着的CreateFile操作中为 Xcopy 打开目标文件。很快,Xcopy 执行一个QueryStandardInformationFile操作,获取它认为是目标的文件大小。但回顾日志,我们提醒自己,QueryStandardInformationFile之前没有对源文件进行任何操作来与文件大小进行比较。相反,如果您监视普通文件的 Xcopy(即使使用),您将在使用 打开源文件后不久/B看到对源文件的操作。QueryStandardInformationFileCreateFile

为了进一步支持这一假设,Xcopy复制并成功验证指向零字节文件的符号链接。显然,文件大小记录是零初始化的,因此即使在复制符号链接时未设置它,当验证过程盲目打开复制的符号链接的目标以获取其大小时,答案零与默认零匹配。

答案2

/v选项根据文件大小来验证每个写入的文件,以确保它们相同。

从 Windows XP 开始,验证功能就内置在xcopy命令中,但在 Windows 的后续版本中,它应该不执行任何操作。它仅用于与较旧的 MS-DOS 文件兼容。

毫无疑问,这种古老的验证码无法与符号链接等较新的功能很好地兼容。

如果您有符号链接,我建议不要使用xcopy。使用可以进行验证的更现代的应用程序,例如 泰拉复制

相关内容