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

sch*_*opy 18 c#

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

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

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


以下是一些问题的一些答案:

复制时间比较:

> C# : 2.15m  
> Windows Explorer: 2.53m  
> TeraCopy: 2.26m
> FastCopy: 2.24m
Run Code Online (Sandbox Code Playgroud)

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

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

Bri*_*eon 7

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

  • +1移动山峰最快的方法就是不要移山.;> (7认同)
  • @schmoopy:在这种情况下,这个答案根本不会对你有所帮助.硬链接和符号链接基本上是文件系统指针.因此,如果您尝试修改从硬链接打开的文件,那么它将更改原始文件的内容.随意对我的回答投下一个downvote.我愿意,但你不能低估自己.保持答案仍然可能有用,否则我会删除它. (2认同)

Guf*_*ffa 5

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

但是,没有太多的开销摆脱,瓶颈仍然是磁盘I/O. 我希望最好能节省5%的执行时间.


Con*_*rix 5

File.Copy 调用Kernel32.dll 中的CreateFile。如果您正在复制大量的小文件(想想数百万个),那么执行 P/Invoke 来处理参数并跳过权限需求可能是值得的。一个大文件 2 分钟的 99.999% 都花在驱动程序代码中。


rer*_*run 2

我假设 windows copy、file.copy、Copyfile 都使用相同的底层操作系统调用来进行复制。我怀疑您编写的任何内容都会优于操作系统内部调用。