2009-07-09 50 views
3

我们的.NET应用程序复制大文件,并需要给用户反馈;所以我们不是使用File.Copy,而是读取一个文件的块并将其写入另一个文件,并在每个块之后显示进度。没有什么不寻常的。但是,假设显示进度的时间可以忽略不计,那么要使用大块的正确大小以提供最快的文件副本?我应该在什么大小的块中复制文件?

回答

2

你应该考虑使用win32函数CopyFileTransacted(仅Vista)或CopyFileEx(Windows 2000和更高版本)。这些由Windows提供,并针对速度进行了优化。

我建议您测试自定义的C#实现性能,并将其与本机File.Copy性能进行比较。如果性能与您的自定义C#实现相比(即相同数量级)。否则,最好使用CopyFileTransacted或CopyFileEx函数。

P.s.从here

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] 
internal static extern bool CopyFileTransacted([In] string lpExistingFileName, [In] string lpNewFileName, [In] IntPtr lpProgressRoutine, [In] IntPtr lpData, [In, MarshalAs(UnmanagedType.Bool)] ref bool pbCancel, [In] CopyFileFlags dwCopyFlags, [In] KtmTransactionHandle hTransaction); 
2

一个非常大的缓冲区会给你最好的传输速度,但粗略的反馈。所以这是一个折衷,它也非常依赖于硬件。

我做了这样一段时间,并在64k缓冲区解决,但你可能想尝试一点点。

而且不管你选择,确保它使用较大块即使你可以很容易地估算进度给用户512(1扇区)的倍数

0

“伪造”的反馈。 取决于应用程序,为什么不让用户设置大小?给用户选项,如果他想要它:)

+4

用户不*要*选项! – weiqure 2009-07-09 11:22:42

+0

“母亲,如果复制速度太慢,只需更改文件传输缓冲区大小......” – 2011-09-02 08:15:14

相关问题