在NTFS文件系统中移动文件夹并保留时间戳

13

抱歉,我知道这听起来像一个新手问题。但是说真的,我是一名经验丰富的开发人员,我知道Windows 7 Pro 64位等操作系统会说:"哦,如果你将一个NTFS树从一个驱动器移动到另一个驱动器,当我写入子文件时,实际上意味着我正在修改父文件夹,所以我将更新其时间戳。"因此,目标文件夹中所有文件的时间戳都与原始文件夹相同,但是所有文件夹的时间戳都相同,就是刚刚修改的日期/时间。

我知道发生了什么。我知道我可以编写自己的实用程序(我已经写了)来在NTFS上复制/移动文件。但是实用程序很危险---如果它们不具备NTFS感知功能,它们可能会忽略其他属性或错过类似NTFS备用数据流(ADS)等内容。

因此,有没有人知道一个好的、NTFS感知的树形移动实用程序,可以简单地移动整个树并保持时间戳?我不想冒失丢失任何东西。谢谢。


SuperUser可能是一个更好的地方来询问这个问题。 - Richard
3个回答

18
参考 Helge Klein 的回答,我更仔细地研究了 Robocopy。原来 Robocopy(最新版本,例如 Windows 7 自带的版本)实际上可以复制文件夹结构的时间戳。还有一个“移动”选项,可以在复制后删除源目录,但在微软的无限智慧中,它与“保留目录时间戳”选项不兼容,因此您需要在复制后删除源树。
命令行参数选项令人望而生畏。经过一些研究,使用 Robocopy 以保留目录时间戳进行复制的基本命令如下:
robocopy %1 %2 /e /dcopy:T

…其中%1是源目录,%2是目标目录。

如果您希望确保复制所有内容,包括NTFS安全性、所有者和审核权限,请指定应复制所有属性并使用备份模式,如下所示:

robocopy %1 %2 /b /e /copyall /dcopy:T

然而,使用这些额外选项需要完整的管理员权限(不仅是管理员帐户)。例如,单击“开始”,右键单击“命令提示符”,然后选择“以管理员身份运行”。然后输入上述命令。
附注:我已经验证了Robocopy也可以传输NTFS流。

哇,好发现。我已经使用robocopy很长时间了,但我不知道/dcopy:T。 - Helge Klein
@GarretWilson,你确定/b会保留所有的安全权限和属性吗?难道不应该使用/dopcy:DAT/copy:DATSOU /copyall一起使用吗?请参考https://support.microsoft.com/en-us/kb/979808。"它们的安全配置信息,例如访问控制列表(ACL),不会被复制。相反,这些文件将从目标文件夹继承其ACL"。 - Pacerier
@Pacerier,请检查一下你的评论。没有 /dopcy:DAT,甚至没有 /dcopy:DAT;只有 /dcopy:T。并且仔细检查一下命令行帮助:/copyall 等同于 /copy:DATSOU。如果你在校对后仍有问题,我会进一步调查。 - Garret Wilson
@GarretWilson,我知道/copy:DATSOU==/copyall。此外,确实有/dcopy:DAT。默认是/DCOPY:DA,其中copyflags为D=DataA=AttributesT=Timestamps。另外,您确定/b会保留所有安全权限和属性吗?这不应该是/dcopy:DAT连同/copy:DATSOU / /copyall吗?请参见http://support.microsoft.com/en-us/kb/979808:“它们的安全配置信息(如访问控制列表(ACL))不会被复制。相反,这些文件从目标文件夹继承其ACL”。 - Pacerier
截至2021年3月,在Windows 10上,robocopy %1 %2 /b /e /copyall /dcopy:T未能保留文件夹时间戳。 - Christoph

3
SynchronizeIt可以做到这一点,与Robocopy一样好,具有良好的GUI和选项,可以轻松查看和选择要复制的文件。http://www.grigsoft.com/wndsync.htm (但请注意,极少数情况下,该工具会损坏目标文件——我曾经用下载管理器(特别是FlashGet和Orbit Downloader)下载的文件遇到过这种情况,只有前25kb被正确复制,其余部分则被填充为零。我不知道原因。我也见过Robocopy在同样罕见的情况下失败——它被相似的文件名所困扰,错过了其中一个文件而复制了另一个文件。因此,现在我总是使用Total Commander或WinMerge来验证复制是否完美。)

完美,正是我所需要的。Total Commander做不到。 - Smeterlink

3
我本来想推荐 robocopy,但在试验该场景时,我发现(让我很意外的是)它会按照你所描述的方式将复制的目录留在新日期下。
另一方面,Total Commander 也会复制目录的时间戳。

1
Helge,您的答案非常有用,我已经点了个赞。它向我展示了Robocopy,也许Total Command也不错。但我认为最好的方法可能是使用我发现的额外选项的Robocopy;请参见我的回答。谢谢! - Garret Wilson
1
仅作跟进,我联系了创建Total Commander的人,他们向我保证“Total Commander确实会复制'最后修改'时间戳和所有ADS,但不会复制'最后访问'和'创建'时间戳。”因此,Total Commander似乎也是一个选择,尽管我更倾向于Robocopy,因为它已经安装在Windows 7上。 - Garret Wilson
+1 给 Total Commander!完美运作,甚至支持 Win8. ;) - dbernard
@dbernard,我们怎样能让它复制“最后访问”和“创建”的时间戳? - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接