我們的.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