我们的.NET应用程序复制大文件,并需要给用户反馈;所以我们不是使用File.Copy
,而是读取一个文件的块并将其写入另一个文件,并在每个块之后显示进度。没有什么不寻常的。但是,假设显示进度的时间可以忽略不计,那么要使用大块的正确大小以提供最快的文件副本?我应该在什么大小的块中复制文件?
3
A
回答
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
“伪造”的反馈。 取决于应用程序,为什么不让用户设置大小?给用户选项,如果他想要它:)
相关问题
- 1. 我应该使用什么标签来存档文件大小?
- 2. 我应该看什么文件大小? IPA?
- 3. 我该怎么办在iPad中限制文件应用程序的大小?
- 4. 为什么我应该在VBA中确定变量的大小?
- 5. 为什么我应该避免在Hadoop HDFS中存储大量小文件?
- 6. 我应该在钛中使用什么“字体大小”度量?
- 7. 为什么磁盘块的大小应该是2的幂?
- 8. 为什么文件大小会重复?
- 9. 我应该合并大文件中的零件文件以达到最大块大小
- 10. 在小文件大小的情况下HDFS块大小会发生什么
- 11. Couchdb复制文件大小
- 12. HDFS块大小和复制
- 13. CFBuldneURLIconFile大小应该是什么?
- 14. 当我复制大文件时,为什么我的应用程序会冻结?
- 15. 从NetworkStream中读取。我应该使用什么字节大小?
- 16. 对于我在database.yml中的池大小,我应该考虑什么?
- 17. 为什么我应该在我的catch块中使用“const”?
- 18. 错误的MTU大小 - 我应该期待什么问题?
- 19. 响应大小的限制是什么?
- 20. HDFS块大小和文件大小的问题,文件小于块大小
- 21. PHP复制文件如果文件大小大于文件B的大小
- 22. 为什么/我应该在什么时候使用dojo模块?
- 23. 复制过程中分离大文件的条件是什么?
- 24. 我应该在MainActivity.java文件的setContentView中定义什么?
- 25. iOS:方法返回一个块然后块存储在数组中,我应该什么时候复制它?
- 26. 调整图片大小,我应该使用什么?
- 27. 为什么我需要在我想要使用该块时“阻止复制”?
- 28. 我应该在弹性搜索中控制索引大小吗?
- 29. 我应该使用什么样的复制?
- 30. 我应该使用什么类型的数据库复制?
用户不*要*选项! – weiqure 2009-07-09 11:22:42
“母亲,如果复制速度太慢,只需更改文件传输缓冲区大小......” – 2011-09-02 08:15:14