我应该将文件复制到什么大小的块中?

时间:2009-07-09 11:12:29

标签: c# .net file-io

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

3 个答案:

答案 0 :(得分:2)

非常大的缓冲区将为您提供最佳的传输速度,但反馈粗略。所以这是一个权衡,它也很大程度上取决于硬件。

我一段时间做了类似的事情并确定了64k缓冲区,但你可能想稍微试验一下。

无论你选择什么,请确保它是512(1扇区)的倍数

答案 1 :(得分: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 :(得分:0)

即使使用较大的块,您也可以轻松估计进度,为用户提供“伪造”的反馈。 根据应用程序,为什么不让用户设置大小?如果他需要,请提供用户选项:)