c#
圧縮ファイルからファイルを抽出するアプリケーションbackgroundworker
があります。C#.net backgroundworker thread not handles handles
backgroundworker
が完了したことに気付きました。
次に、抽出されたファイルがbackgroundworker
になると、IOException
という名前のディレクトリが削除され、そのディレクトリとファイルが使用中であることがわかります。
私はprocessexplorer.exe
を使用しました。このプロセスはC#アプリケーションです。私は電話し、backgroundworker
が.CancelAsync()
と.Dispose()
であることを確認しようとしました。ハンドルがファイルに残っている理由は分かりません。
私のアプリケーションを閉じて再度起動すると、抽出された一時的な場所から起動時にファイルが削除されます。アプリケーションの起動時に一時的な場所から抽出されたファイルを消去するコードがあります。
圧縮ファイルからそれらを抽出して作成したディレクトリとファイルを完全に削除することはできないようですが、私のアプリケーションには前述のファイルとディレクトリに対するハンドルがまだ開いているスレッドがあります。
私はこれらのディレクトリとファイルを強制的に削除することができますか?自分の作成と現在の処理を担当していますか?
圧縮ファイルを解凍している外部の.exeのコードです。「使用」ブロックは使用していませんでしたが、それを変更して助けにはなりませんでした。
using (Process proc = new Process())
{
proc.StartInfo.FileName = "cmd";
proc.StartInfo.Arguments = param;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardInput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
StreamReader reader = proc.StandardOutput;
while (!reader.EndOfStream)
{
lines.Add(reader.ReadLine());
}
reader.Close();
proc.WaitForExit();
}
このようなことを防ぐには、ファイルストリームは 'using()'ブロックの内側にある必要があります。 – caesay
塩鉱山で20年以上の間、私は事実のために驚異的な数のものを知っていました。彼らの約90%は絶望的な妄想でした。あなたは「事実のためにこれを知っていますか」 Dispose()を呼び出すために*保証されている 'using'ブロックを使用する代わりに、なぜDispose()を呼び出していますか?デバッガのワーカースレッドコードをトレースしてDispose()呼び出しに到達できますか?あなたのコードを見ることはできますか? –
私はcaesayと一緒にいます - ファイル処理コードをUsingに入れ、必要なファイルを実行します。また、そのベストプラクティス。 – Hexie