Gua*_*man 10 .net c# windows performance copy
我正在为自己制作一个简单的文件夹同步备份工具,并使用File.Copy遇到了相当大的障碍.进行测试将大约44,000个小文件(Windows邮件文件夹)的文件夹复制到我系统中的另一个驱动器时,我发现使用File.Copy比使用命令行并运行xcopy来复制相同的文件/文件夹慢3倍.我的C#版本需要超过16分钟来复制文件,而xcopy只需要5分钟.我试图在这个主题上寻求帮助,但我发现所有人都在抱怨通过网络缓慢复制大文件的文件.这既不是大文件问题也不是网络复制问题.
我发现了一篇关于更好的File.Copy替换的有趣文章,但是发布的代码有一些错误会导致堆栈出现问题,而且我无法通过足够的知识来解决代码中的问题.
是否有任何常见或简单的方法可以更快速地替换File.Copy?
小智 8
需要考虑的一件事是您的副本是否具有在复制期间更新的用户界面.如果是这样,请确保您的副本在单独的线程上运行,或者您的UI将在复制期间冻结,并且通过阻止调用来更新UI将减慢副本速度.
我编写了一个类似的程序,根据我的经验,我的代码运行速度比Windows资源管理器副本快(xcopy
从命令提示符不确定).
此外,如果您有UI,请不要更新每个文件; 而是更新每个X兆字节或每个Y文件(以先到者为准),这样可以将更新量保持在UI实际可以处理的范围内.我使用了每个.5MB或10个文件; 那些可能不是最佳的,但它明显增加了我的复制速度和UI响应.
另一种加快速度的方法是使用Enumerate函数而不是Get函数(例如EnumerateFiles
代替GetFiles
).这些函数尽快开始返回结果,而不是在列表构建完成后等待返回所有内容.它们返回一个Enumerable,所以你可以在结果上调用foreach:foreach(字符串文件输入System.IO.Directory.EnumerateDirectories(path))
.对于我的程序,这也在速度方面产生了明显的差异,并且在像你这样处理包含目录的情况下会更有帮助很多文件.
在旋转磁盘上最减慢 IO 操作的事情之一是移动磁盘磁头。
假设您的许多小文件(它们都彼此相关)在磁盘上的距离比它们靠近副本的目的地更近(假设您是从磁盘的一部分复制)是合理的,并且可能非常准确到同一磁盘的另一部分)。如果您先复制一点然后再写入一点,则会为其他进程移动源磁盘或目标磁盘上的磁头打开一个机会之窗。
XCopy 比 Copy(在这两种情况下都是命令)做得更好的一件事是 XCopy 在开始将这些文件写到目的地之前先读入一堆文件。
如果您在同一磁盘上复制文件,请尝试分配一个大缓冲区以一次读取多个文件,然后在缓冲区已满时将这些文件写出)。
如果您从一个磁盘读取并写入另一个磁盘,请尝试启动一个线程以从源磁盘读取,并启动一个单独的线程以写入另一个磁盘。
归档时间: |
|
查看次数: |
7647 次 |
最近记录: |