在Windows中复制文件时如何保留文件属性?


41

在Linux上,我们可以简单地执行以下操作:

cp -pr directory

在Windows中如何做?可以在Windows资源管理器中完成吗?有任何GUI工具建议吗?

如果可以保留NTFS权限和创建/修改/访问时间,那将是最好的。至少,我需要保留文件目录的修改日期。Windows资源管理器的副本不保留目录的修改日期。



1
我不认为这是重复的。文件创建时间只是文件属性之一。
netvope 2010年

该问题的答案提供了将保留所有时间戳,mtime,ctime和atime的软件。
约翰·T

可能感兴趣:support.microsoft.com/kb/310316。不幸的是,其中某些注册表项在Vista或更高版本中不再起作用。
Amro 2013年

robocopy c:\folderA c:\folderB /mir /it是你所需要的全部。请注意,这将完全删除c:\ folderB并创建一个与c:\ folderA镜像的新c:\ folderB。
Pacerier '16

Answers:


6

在Windows中没有简单的方法可以做到这一点。有几个程序声称可以保留文件的创建日期。
以下是一些可以解决问题的程序:http://forum.soft32.com/windows/preserve-creation-date-Copy-ftopict361820.html   (断开的链接;不在Wayback Machine中)。

仅使用Windows资源管理器是不可能的。如果查看CopyFile,CopyFile函数(winbase.h)的文档 ,您会发现它避免了该问题。但是,  CopyFile函数(Windows开发者预览版) (具有相同URL的2012存档)说:

文件时间语义

本文应记录有关文件创建/修改/访问时间的语义。

创建时间:如果目标文件已经存在,则保留其创建时间,否则将其设置为当前系统时间。
上次修改时间:始终从源文件的修改时间复制。
上次访问时间:始终设置为当前系统时间。


链接断开。
Smile4ever

21

RoboCopy可以使用/ DCOPY:T开关为目录保留mtime,但这仅在Vista和更高版本中有效。它还可以保留ACL。或者,可以将FastCopy配置为保留目录mtimes,ACL和ADSes


在Windows中,推荐使用robocopy进行此操作,因为它不仅可以复制文件/文件夹属性,还可以在整个复制过程中实现适当的文件完整性和错误处理。
megamorf 2014年

@megamorf:robocopy有什么特殊之处?它不执行任何数据的校验和或散列,它依赖于操作系统来报告错误,就像几乎所有其他程序一样。
afrazier 2014年

我同意到目前为止,robocopy还没有后期校验和比较功能。但是通常,robocopy会在发生错误时重新传输整个文件。如果您希望它在发生错误后继续将文件的其余部分写入目标位置,而无需再次传输整个文件,则可以指定/ Z开关。
megamorf 2014年

@afrazier,为什么不简单使用/mir
Pacerier '16

2
@Pacerier,因为问题不是关于镜像树,而是关于复制文件和文件夹以及保留尽可能多的元数据。不仅/mir要从目标文件夹中删除数据,还需要使用/dcopy:t来保留目录mtime并/copyall保留不仅仅是文件时间戳。
afrazier

19

...或者您可以制作一个zip存档(压缩方法设置为“存储”),然后将文件解压缩到要复制的位置。日期/时间属性与原始文件相同。


好主意。但这是否会复制“其他内容”,例如文件属性等?
Pacerier '16

2
这并不总是有效。以7-zip为例,使用7zip压缩不会保留文件时间之一(我忘记了)。它不保留任何目录时间(我记得),使用ZIP可以保留创建时间和修改时间,但是7zip仅保留某些时间,具体取决于您解压缩的方式:是从程序菜单中拖放还是提取。测试很好,年轻的蚱hopper。
2016年

3
非常感谢您,这对我来说很好。我使用的是ZIP格式的7zip(创建日期未保留为7Z格式)。
AFract

您可以添加用于执行此操作的特定命令吗?使用您建议的压缩方法的特定命令示例?这将使它更像是一个完整的答案”,而不是更多的建议或评论。这还将使无数人不必进行搜索来弄清楚如何完成您的建议。此外,作为奖励,还提供了一个链接到文档或文章中获取有关此方法的更多信息将是很棒的。提供所有信息可以使其他所有人免于重新发明(搜索)轮子,并且可以大大增加投票数。我们谢谢!
SherylHohman

6

Robocopy命令行工具(Windows的大多数版本附带)
在Windows 10计算机上,它位于C:\Windows\System32

Wikipedia中,它可以与以下选项集一起使用,以保留文件目录的时间戳以及其他属性:

Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPYALL /E /R:0

  • /DCOPY:T保留原始目录的时间戳(需要XP026或更高版本)
  • /E:以递归方式复制目录,包括空目录
  • /R:0:不要重试锁定的文件(失败副本的重试次数默认值为100万),

  • /COPYALL:复制所有文件信息,
    (等效于/COPY:DATSOU,其中

    • D=数据,
    • A=属性,
    • T= 文件时间戳
    • S=安全性= NTFS ACL,
    • O=所有者信息,
    • U=审核信息),

如果你只是想保存日期和目录时间戳,但确实希望空子目录拷贝过来,做希望其他属性保留,那么你可以使用:
Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPY:T /S

其中,/S拷贝非空的子目录

要查看完整的语法,请robocopy /?在命令提示符下键入,或查看以下博客文章:https : //ss64.com/nt/robocopy.htmlhttps://techjourney.net/robocopy-syntax-command-line -开关和示例/

我最近运行的命令示例:
Robocopy D:\ C:\D_backup /DCOPY:T /COPYALL /E /R:0 /ZB /ETA /TEE /V /FP /XD D:\$RECYCLE.BIN /XD "D:\System Volume Information" /LOG:C:\D_backup_robocopy.LOG /MIR

请注意,排除2个子目录是如何要求将/XD标志使用两次的。另外,第二个目录排除项使用引号,因为目录名中有空格。

最后,您可以添加/L标记以对命令进行真实测试之前对其进行测试。这样,您可以验证它不会复制(或删除)您不需要的任何目录/文件,并且您的命令中没有错误。

编辑:从根目录(又名驱动器)复制到文件夹(非根目录)时遇到问题

运行上面的示例命令后,该目录不可见!(即使在Windows 10中show hidden filesshow system files已检查!)根据https://serverfault.com/a/455029/399723的以下命令解决了此问题:

attrib -h -s C:\D_backup

或者,/A-:SH根据https://serverfault.com/a/565804/399723,添加“从系统文件中取消隐藏属性”,这样可以防止该目录最初隐藏。另请参阅https://ss64.com/nt/robocopy.html
这种讨论为解决方案提供了更多的思路。

Robocopy D:\ C:\D_backup /A-:SH /DCOPY:T /COPYALL /E /R:0 /ZB /ETA /TEE /V /FP /XD D:\$RECYCLE.BIN /XD "D:\System Volume Information" /LOG:C:\D_backup_robocopy.LOG /MIR

其他软件:

另外,如果您不想使用命令行,则可以下载robocopyGUI版本

另一个Windows实用程序是XCopy,尽管它已包含在Windows 10中,但已被弃用。请参阅有关陷阱的链接。

RoboCopy的Wikipedia页面(在此文章顶部链接)列出了可以使用的其他软件。


1
好答案。应该选择一个,因为第一个已经过时了。自Windows 7以来使用robocopy来修剪客户端备份中的空目录,但是,我认为自Windows XP以来它就可用
DGoiko

@DGoiko我认为你是对的。我肯定在Windows 7上广泛使用了它。不幸的是,不再选择购买特殊的Windows 7 Pro笔记本电脑。所以现在有了Win10。我认为我使用XP时从未看过,但是已经有很长时间了。只是不是那么知名。
SherylHohman

Robocopy GUI非常好。
Eddie Kumar

4

同步它!3.5保留所有时间戳(文件和文件夹,修改和创建)。这是我在Windows XP上知道的唯一可以完美做到这一点的软件,除了Robocopy之外,而且我已经尝试了很多。但是要注意,它可能会产生损坏的文件,其中包含使用FlashGet或Orbit Downloader之类的软件下载的源文件(生成的文件具有相同的大小,但实际上仅复制25kB,其余的填充为零)。我问软件的创造者他是否能弄清楚为什么,但是他毫无头绪。我猜想这与此类软件以小包下载文件(旨在优化速度)有关,而我的数据分区却非常分散。

Robocopy XP026确实包含在Windows Vista中,但可以在Windows XP上使用。搜索“ Robocopy XP026”,否则我可以在这里发送文件,因为它不太容易找到。或者,您可以安装Robocopy GUI,然后robocopy.exe在System32文件夹中搜索文件,以便从命令行使用它。我拥有的文件为208kB,版本号为5.1.2600.26。

不过,“备份模式”似乎存在一个错误:

http://msmvps.com/blogs/martinzugec/archive/2008/03/03/ugly-bug-in-robocopy-ignoring-security-on-file-level.aspx

Robocopy XP027版本显然不再具有此错误,但在Windows XP上不起作用。


文件下载实用程序(如Bittorrent)在磁盘上分配文件的完整大小(填充为0),并从多个来源下载节,并将它们存储在文件中的正确位置。该文件在启动时将有很多0000。可能是文件从未完全下载过或同步过!看到太多0000,放弃了副本。
Chloe 2013年

谢谢!我使用了同步!太快了!SyncToy和Unison弄乱了文件修改时间。Unison正在破坏Cygwin的符号链接。SyncToy甚至正在复制“我的音乐”,该文件原来是在目的地的一个交汇处,但是当我刷新时,即使一切都一样,它仍然希望再次复制!
Chloe



1
xcopy *.* C:\temp\Pics /c /d /e /h /i /k /q /r /s /x /y

我不确定哪个开关可以保持文件日期,但是可以正常工作。然后,我压缩C:\ temp \ Pics目录,该目录还维护文件日期,如前所述。


1
将副本压缩后如何适应此讨论?
斯科特,

还可以通过为[zip]文件保留时间戳来解决问题,这似乎占用了提出问题的人。不客气,斯科特。碰巧是一个有用的答案,即使不是正确的答案。
2015年

这会保留文件日期/时间,但不会保留文件夹。
barneco

1

到目前为止,对我而言,最简单的方法是“发送至”方法。它不需要任何外部应用程序。以我的经验,它保留了所有原始文件属性。

我以前使用的方法是compression / zip文件夹方法。尽管这肯定会花费更长的时间,因为在压缩和解压缩时,不仅文件被复制,而且被处理和压缩。

%appdata%\Microsoft\Windows\SendTo
要么。 C:\Users\_______\AppData\Roaming\Microsoft\Windows\SendTo

在要复制它们的文件夹中添加一个快捷方式,sendto当您右键单击要复制的文件时,该项将出现在菜单中。


感谢您分享使用“右键单击>发送到”的技巧。它起作用,除了创建日期。以前,我使用的是本机xcopy命令:xcopy Source Destination /kes。(该k标志允许保留修改时间戳记,但不保留创建日期)。压缩为zip(或rar)的压缩方法是一种很好的方法,但通常花费的时间太长。
OuzoPower

0

移动文件夹和目录并保留创建日期很简单。只需按住Shift文件夹并将其拖动到新位置(移动命令)即可。修改日期将是当前日期,但创建日期将保留原始日期。


2
不要这样做!这将从原始文件夹中删除文件。尝试通过此操作从手机中丢失了无法恢复的数据(没有CTRL + Z不起作用)。
BadAtPHP '17


0

xcopy可以正常工作。只需指定/ k标志即可复制属性。

语法
xcopy来源[目标] [可选参数]

xcopy命令可以将一个或多个文件或目录树从一个位置复制到另一位置。从Windows 95到Windows 8的所有版本的Windows中都包含xcopy命令。


1
我只是尝试了该/K参数,但它没有保留创建日期。
CoDEmanX

在我看来,它有时有时会起作用,有时甚至无法正常工作;)
SebastianH

0

我做到了

rsync -avu --modify-window = 3602源目录/目标目录/

(实际上,它用作从一个目录到另一个镜像的同步工具,并且与Linux系统相比,timewindow选项是为了防止Windows系统将时钟移动1小时以实现夏时制等问题)

在Windows内的cygwin环境中在装有Windows驱动器的Windows内的linux虚拟机中(例如,virtualbox)

NB cygwin和virtualbox都是免费的,使您能够在Windows上或多或少地具有linux功能-它们都需要进行一些设置-特别是virtualbox,但是有很多好处。...

我自己的问题是文件的时间正确,但目录却没有。rsync已整理出目录中的日期以及文件中的日期。


0

此命令为文件复制相同的时间戳。请注意,它不会对文件夹本身进行完全相同的时间戳记。另请注意,我在源(Temp1)和目标(Temp2)周围都加上了引号。如果路径中有空格,请执行此操作。我没有空格,但是我认为在最坏的情况下应该包括它。

robocopy /E /copy:DAT "C:\Temp1" "c:\Temp2"

要使文件夹的时间戳也保持相同:

robocopy / E / copy:DAT / dcopy:DAT“ C:\ Temp1”“ c:\ Temp2”

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.