2009-07-09 44 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

相關問題