長時間の操作を中止する
-
27-09-2019 - |
質問
巨大なファイル (数 GB) をコピーするためにバックグラウンド ワーカーを実行していますが、コピーの途中でプロセスをキャンセルする方法を知りたいです。コピー前に CancelPending プロパティを確認することはできますが、コピーがすでに進行中の場合にそれを行う方法がわかりません。
if (worker.CancellationPending) // check cancellation before copy
{
e.Cancel = true;
}
else
{
File.Copy("sourceFile", "destinationFile"); // need to cancel this
}
アドバイスをお願いします、ありがとう!
解決
よくわからないけどそう思う File.Copy
によって支えられています CopyFile
この機能を許可しない winapi の機能。
を指さす必要があります CopyFileEx
これにより、ファイルの一部がコピーされるたびにコールバック メソッドが可能になります。
他のヒント
私が知っている唯一の方法は、 CopyFileEx(kernel32)
私の知る限り、バックグラウンドワーカーは、多くの小さな操作を実行するのに最適です。面倒なことはわかっていますが、コピー操作用に別のスレッドを作成することを検討することをお勧めします。そうすれば、コピーの最中であれば、スレッドを強制終了できます。(これがコピーにどのように影響するかはわかりませんが、この方法を使用すると一時ファイルが残るかどうかはわかりません。)
ファイルをチャンクでコピーします。チャンク間で、操作がキャンセルされているかどうかを確認します。
これは車輪の再発明のようなにおいがするかもしれませんが、CopyFileExをdllimportしたくない場合はオプションです。
File.Copy
またはその他のコピー機能を使用する代わりに、ファイルを自分でコピーすることもできます(ソースストリームからの読み取り、宛先ストリームへの書き込み)。すべてのチャンクをコピーするために必要なループで、操作を中止するかどうかを確認してから、コピープロセスを中止するために必要な操作を実行できます。