有没有更快的方法来复制File.Copy以外的文件

时间:2010-08-03 17:40:01

标签: c#

在同一驱动器上从文件夹A到文件夹B执行1.6GB文件File.Copy(src, dest);大约需要2分钟。有没有更快的方法在C#/ .NET代码中执行此操作(无硬件) - 有流,线程等的东西吗?

文件流会更快吗?如何使用线程池对文件进行分块,并读取一系列字节/写入一系列字节[这听起来像是破坏文件的好方法,但完整性不是优先级1,它的速度:-) ]

我搜索过但是每个人都说使用File.Copy,但速度很慢(与Windows Copy一样慢) - 我宁愿不使用第三方工具。


以下是一些问题的答案:

复制时间比较:

> C# : 2.15m  
> Windows Explorer: 2.53m  
> TeraCopy: 2.26m
> FastCopy: 2.24m

好吧,这些不是平均值,我知道它们可能会在后续运行中略有改变,但我真的认为有更快的方法来复制文件,因为我认为Windows正在进行额外的安全性和完整性检查: - (< / p>

我仍然希望得到一些好的答案(比如'哦,如果你做缓冲 m 并关闭安全性,超过1.5GB的文件会 x 更快em> n ') - 好的,我只是希望在这一点上。

8 个答案:

答案 0 :(得分:7)

如果您对创建符号或硬链接而不是实际副本感兴趣,那么以下Windows API可能会有所帮助。

答案 1 :(得分:5)

您可以尝试使用已经可以使用的硬件,并在内存中分配一个大缓冲区。通过以更大的块读取和写入,您可以删除一些开销。

然而,没有太多的开销摆脱,瓶颈仍然是磁盘I / O.我希望最多可以减少5%的执行时间。

答案 2 :(得分:4)

File.Copy在Kernel32.dll中调用CreateFile。如果你要复制很多很小的文件(想想数百万),那么使用P / Invoke来玩参数并跳过Permission Demands可能是值得的。在驱动程序代码中花费了2分钟的99.999%的大文件。

答案 3 :(得分:2)

我认为windows copy,file.copy,Copyfile都使用相同的底层操作系统调用来进行复制。我怀疑你写的任何东西都会胜过OS内部调用。

答案 4 :(得分:1)

我没试过这个,但可能很快。

执行两个内存映射,一个到输入文件,一个到输出,并将内存从一个移到另一个。操作系统执行的页面映射调整到最高性能,因为它会影响整体系统速度。

答案 5 :(得分:1)

对于单个文件,转到/来自同一个驱动器,您的问题的答案是:

对于网络传输,移动大量文件以及其他更复杂的方案,可能还有改进的余地。

如果您当前的要求是将GB复制到同一磁盘上的第二个物理(非符号)位置,那么提高性能的最佳机会可能是更快的磁盘。

答案 6 :(得分:0)

我认为您应首先检查磁盘碎片的数量。如果你的文件很多,并且没有大的连续可用空间用于第二个,那么磁盘必须经常移动,这非常慢。

也许你的磁盘简单旧又慢,你可以达到它的最大性能。在这种情况下,解决方案很简单,您需要购买新的或更好的两个并创建RAID 0。

您还可以检查在复制期间是否有其他内容不使用相同的磁盘,例如防病毒或索引服务。

我没有提出任何软件解决方案,因为我认为没有什么比操作系统提供的功能更快。

答案 7 :(得分:0)

如果文件在缓存中(以相同的方式做5倍以避免),所有将取决于操作系统在复制时决定的分配。

最明显的结果是您多次重复测试。