0

私は次のことを行います:

  1. 実行可能ファイルをにコピーしますC:\temp\x.exe

  2. で実行可能ファイルを開始し、 によって返されたオブジェクトSystem.Diagnostics.Process.Startを呼び出して、プロセスが同期的に終了するのを待ちます。WaitForExitProcessStart

  3. 実行可能ファイルを削除するC:\temp\x.exe

一部のマシンでは、これはうまく機能しますが、他のマシンでは、ファイルがまだ使用されているため、への呼び出しがDeleteFile失敗します。したがって、一度WaitForExit戻ったとしても、Windows が EXE で終了したことを意味するわけではないようです。

ここでのオプションは何ですか? DeleteFile削除が成功するか、ループがタイムアウトするまで、数ミリ秒後にループで再試行することは明らかです。しかし、ファイルがすべての人によって閉じられるのを待つためのよりクリーンな方法はありますか?

4

1 に答える 1

1

実行が完了したときに exe がロックされたままになる理由はいくつかあります。コードに関係するものもあれば、システムに関係するものもあります。あなたのコードについて考えることができる2つの主な理由は次のとおりです。

exe ファイルを一時的な場所にコピーするときにファイル ストリームを閉じる方法は、明示的に解放されていない場合、解放のタイミングが時々変わる可能性があります。

2 つ目は、プロセスの実行が完了しても、システムの観点からは完了していないということです。

最初のものは回避できますが、2番目のものはプロセスリストで監視できますが、まだロックの可能性があります(プログラムが2回並行して実行されている、ウイルススキャンが一時フォルダーを手動でクリーニングしている、ディスククリーンアップウィザード)。したがって、プログラムのロジックを作り直すことをお勧めします。実行可能ファイルが c# で記述されている場合は、ファイルをコピーする代わりに、バイナリをロードしてプログラムを実行します。

何らかの理由で、ファイルを実行するたびにファイルをコピーする必要がある場合は、優先度の低いクリーンアップ スレッドを生成します。失敗した場合は WaitForExit 呼び出しの後にクリーンアップを試行し、再度失敗した場合は x ミリ秒後に再試行し、2x 後に試行するなど。

そうは言っても、システムレベルでファイルロックを探すための(おそらく管理されていない)API呼び出しになると思います。個人的には、システムにそれを自己理解させるだけです

于 2009-08-21T14:24:17.300 に答える