3

巨大なファイル (数 GB) をコピーするためにバックグラウンド ワーカーを実行していますが、コピーの途中でプロセスをキャンセルする方法を知りたいです。コピーの前に CancellationPending プロパティを確認できますが、コピーが既に進行中の場合に確認する方法がわかりません。

if (worker.CancellationPending) // check cancellation before copy 
{   
    e.Cancel = true;
}
else
{    
    File.Copy("sourceFile", "destinationFile"); // need to cancel this
}

アドバイスしてください、ありがとう!

4

5 に答える 5

6

よくわかりませんが、この機能を許可しないwinapiFile.Copyの機能に支えられていると思います。CopyFile

CopyFileExファイルの一部がコピーされたときはいつでも、コールバック メソッドを使用できるようにする必要があります。

于 2010-06-14T13:55:49.087 に答える
2

私が知っている唯一の方法は、CopyFileEx (kernel32)を使用することです

于 2010-06-14T13:56:21.083 に答える
0

ファイルをチャンクでコピーします。チャンク間で、操作がキャンセルされたかどうかを確認します。

これは車輪の再発明のようなにおいがするかもしれませんが、CopyFileEx を dllimport したくない場合のオプションです。

于 2010-06-14T14:02:00.277 に答える
0

またはその他のコピー機能を使用する代わりにFile.Copy、ファイルを自分でコピーすることもできます (ソース ストリームからの読み取り、宛先ストリームへの書き込み)。すべてのチャンクをコピーするために必要なループでは、操作を中止するかどうかを確認してから、コピー プロセスを中止するために必要な操作を実行できます。

于 2010-06-14T14:02:04.527 に答える
0

私の知る限り、バックグラウンド ワーカーは、多くの小さな操作を実行するのに最適です。面倒なことは承知していますが、コピー操作用に別のスレッドを作成することを検討することをお勧めします。そうすれば、コピーの途中であれば、スレッドを強制終了できます。(これがコピーに何をするかはわかりませんが、この方法を使用して一時ファイルが残るかどうかはわかりません。)

于 2010-06-14T13:54:40.483 に答える