复制文件的最快方法

复制文件的最快方法

如果我们在构建服务器 (CCNET) 上成功构建,则所有 ASP.NET 网站文件都将复制到虚拟目录 (%output_dir%),以便非开发人员可以查看/测试网站的最新版本。构建结束时,将执行以下 bat 文件。

rmdir /s /q "%output_dir%"
mkdir "%output_dir%"
xcopy "%source_dir%*"  "%output_dir%" /e /c /i /q /-y

问题是我发现复制速度很慢,我想知道 Windows 2008 中是否有比 xcopy 更快的复制命令?源和目标位于同一驱动器上。以下是我们复制时使用的参数。

/e = copies directories and sub directories including empty ones.
/c = continues copying even if there are errors
/i = if destination does not exist destination is directory
/q = don't display filenames
/-y = confirm overwrite

答案1

仅从性能角度来看复制或者机器人复制会给出类似的结果。我在 Windows Vista 64 位 SP2 机箱上进行了几次测试,以进行比较。所有复制均在内部 7200 RPM Sata II 磁盘和外部 USB 2.0 驱动器之间执行,或在指示的同一内部驱动器本身上执行。没有进行任何特殊设置(自行决定是否使测试无效/有效),只需将命令输入批处理文件即可执行。PowerShell 用于捕获开始和停止时间。经过几次测试后,以下是我使用的工具的平均值:

文件:732,909,568 字节(698 MB),1 个 ISO 文件已复制到同一内部磁盘上的不同目录。

copy      6 secs (ex. copy G:\folder1\* G:\folder2\)
xcopy     6 secs (ex. xcopy G:\folder1 G:\folder2 /I /E /Y /R)
robocopy  6 secs (ex. robocopy G:\folder1\ G:\folder2 /E /NP)
teracopy 28 secs (ex. TeraCopy.exe Copy G:\folder1\ G:\folder2\)
fastcopy 19 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=G:\folder2)  

文件:732,909,568 字节(698 MB),1 个 ISO 文件已复制到外部 USB 磁盘。

copy     36 secs (ex. copy G:\folder1\* I:\folder2\)
xcopy    35 secs (ex. xcopy G:\folder1 I:\folder2 /I /E /Y /R)
robocopy 36 secs (ex. robocopy G:\folder1\ I:\folder2 /E /NP)
teracopy 36 secs (ex. TeraCopy.exe Copy G:\folder1\ I:\folder2\)
fastcopy 38 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=I:\folder2)  

文件:45,039,616字节(42.9MB)5个随机文件复制到外部USB磁盘

copy      6 secs (ex. copy G:\folder1\* I:\folder2\)
xcopy     5 secs (ex. xcopy G:\folder1 I:\folder2 /I /E /Y /R)
robocopy  6 secs (ex. robocopy G:\folder1\ I:\folder2 /E /NP)
teracopy 12 secs (ex. TeraCopy.exe Copy G:\folder1\ I:\folder2\)
fastcopy  6 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=I:\folder2)

文件/目录:1,087,180,800 字节(1.01 GB),27 个文件/8 个目录已复制到外部 USB 磁盘。

copy     *Not included in test
xcopy    57 secs (ex. xcopy G:\folder1 I:\folder2 /I /E /Y /R)
robocopy 58 secs (ex. robocopy G:\folder1\ I:\folder2 /E /NP)
teracopy 56 secs (ex. TeraCopy.exe Copy G:\folder1\ I:\folder2\)
fastcopy 60 secs (ex. fastcopy.exe /auto_close G:\folder1 /to=I:\folder2)

这绝不是一个详尽的测试,但只需对这个类别中一些更受欢迎的工具进行快速的真实世界场景测试,就可以表明使用 xcopy 或 Robocopy 是相当安全的(仅从性能角度来看)。此外,Robocopy 选项/NP(无进展)不会为您节省任何时间。但这并不意味着您不能从使用 xcopy 以外的其他工具中受益。Robocopy 是一个很好的例子(来自维基百科):

Robocopy 因其超越内置 Windows copy 和
xcopy 命令的功能而引人注目,其中包括:

  • 能够容忍网络中断并从上次中断的地方恢复复制(不完整的文件用对应于 1980-01-01 的日期戳标记并包含恢复记录,以便 Robocopy 知道从哪里继续)。
  • 默认情况下能够正确复制属性、所有者信息、备用数据流、审计信息和时间戳,而无需大量经常被遗忘的命令行开关。
  • 能够正确复制 NTFS ACL(当提供 /COPYALL 时),并主张 Windows NT“备份权限”(/B),以便管理员可以复制整个目录,包括管理员无法读取的文件。
  • 默认情况下具有持久性,如果无法打开文件,则可编程进行次数的自动重试。
  • “镜像”模式,通过选择性地删除目标中不再存在于源中的文件来保持树同步。
  • 能够复制大量文件,否则会导致内置 XCOPY 实用程序崩溃。
  • 命令行上的进度指示器会持续更新。
  • 能够复制超过 256 个字符的长文件和文件夹名称(理论上最多 32,000 个字符),而不会出现错误。

答案2

我通常使用:

robocopy source dest /E /MIR

或者参数的其他变体——可能是/NFL /NDL /NS /NC /NP为了匹配“安静”

答案3

实际上,通过消除网络,您确实限制了测试。您可能希望考虑使用网络共享,这将是大量的管理工作。

此外,您应该使用 FTP,完全跳过 CIFS。Eseutil.exe 是您可以添加到其中的另一个实用程序。(可以在其他地方使用的 Exchange 实用程序,以及它的四个依赖 dll。)

那么我想看看你的结果。

答案4

您说源和目标位于同一驱动器上,但它们都在构建服务器上吗?

如果构建服务器是源和目标的位置,请考虑将一个文件夹或另一个文件夹移动到另一个驱动器,也许在另一个控制器上。

如果构建服务器不是源和目标的位置(构建放置并不总是在构建它们的服务器上),请考虑在源和目标文件夹所在的服务器上创建一个任务。然后只需远程启动该任务即可。

相关内容