2009-07-09 7 views
3

.NETアプリケーションは大きなファイルをコピーするので、ユーザーからのフィードバックを得る必要があります。したがって、File.Copyを使用するのではなく、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); 
+0

はXPで利用可能なCopyFileTransactedですか? – Simon

+0

CopyFileTransactedは、Windows Vistaからはサポートされていません。しかし、CopyFileExはXP上でサポートされており、進捗情報も提供しています。私の更新された答えを見てください。 – inazaruk

2

非常に大きなバッファを使用すると、最高の転送速度が得られますが、粗いフィードバックが得られます。それはトレードオフであり、ハードウェアにも大きく依存します。

私はこのようなことをしばらくしてから64kバッファーに落ち着けましたが、少し実験したいかもしれません。あなたが選ぶ

そして何でも、フィードバック「偽造」あなたは簡単にユーザーを与えるために進捗状況を推定することができ、より大きなチャンクを使用した場合でも、それは512(1セクタ)の倍数

0

だことを確認してください。 アプリケーションに応じて、ユーザーにサイズを設定させるのはなぜですか?彼がそれを望むならユーザオプションを与えてください:)

+4

オプションは必要ありません。 – weiqure

+0

"お母さん、コピーが遅すぎるとファイル転送バッファサイズを変更するだけ..." –

+0

"オプション"をユーザーに提供する最も良い方法は、「詳細情報」ボタンまたは「詳細を表示」ボタンがあるUIデザインですより詳細な情報を表示すると、バッファサイズを縮小してユーザーのフィードバックをより頻繁に減らすことができますが、折りたたむとより細かくなります。 – Seph

関連する問題