0

これが取引です。

私の WinApp は実行中ですよね? プロセス「A」としましょう。ファイルを作成し、ハンドルを保持します(書き込み用にファイルを開いたままにします。これは必須です)。
次に、他の msbuild プロセスを開始します。これを「B」と呼びましょう。このプロセスは、System.Diagnostic.Processクラスで開始されます。
ある時点で、私の WinApp (A) は、以前に作成されたファイルを削除する必要があります (ファイルは A 自体によって作成されたことを思い出してください)。そのとき、「プロセスはファイル 'X' にアクセスできないため、ファイル 'X' にアクセスできません。別のプロセスで使用されています。」そして、実際にはそうです!... プロセス 'B' を終了すると、'A' だけがファイルを正常に削除できます。

私の質問は次のとおりです
。1)作成したプロセスに、開いたファイルを処理しないことを伝える方法はありますか?
2) 私のシナリオを達成する別の方法はありますか?

4

4 に答える 4

2

引数をに設定してCreateProcessSystem.Diagnostic.Process.Start呼び出すようです。bInheritHandlestrue

ProcessStartInfoUseShellExecuteでtrueに設定するか、直接P/Invokeに設定してみてください。CreateProcess

于 2008-12-18T16:03:08.167 に答える
0

排他的にロックされているファイルを読み込もうとしたときに、同様の問題が発生しました。

私はそれを使用してそれをやろうとしていました:

FileStream exclusiveWriter = new FileStream(@"C:\Temp\FileLockTest1.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);  

完全な議論はで利用可能です:

別のプロセスによって排他的にロックされたファイル-MSDNフォーラムディスカッション

お役に立てれば。

于 2008-12-18T16:15:02.557 に答える
0

ハンドルを使用しているプロセスを閉じずにファイル ハンドルを強制的に閉じることは可能ですが、これによりアプリケーションがクラッシュする可能性があります。つまり、自分のやりたいことをすると、'B' がクラッシュする可能性があります。そうは言っても、アプリケーションであるProcess Explorerがこれを実行できるため、あなたが求めていることは間違いなく可能です。そのリンクでメッセージボードを検索すると、有益な情報が見つかるかもしれませんが、実際にハンドルを閉じることは気にせず、どのアプリケーションがハンドルを使用しているかを見つける行為でさえフラストレーションを感じます。

于 2008-12-18T15:27:19.160 に答える
0

ハンドルが開いているファイルを確実に削除する方法はわかりませんが、ファイルが削除されるのをシステムの再起動まで待つことができる場合は、Sysinternals のMoveFileユーティリティと同じ手法を使用できます。

このプログラムは、Windows が起動時にチェックするHKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperationsキーにレジストリ値を追加します。これにより、すぐではありませんが、ファイルが確実に削除されます。

于 2008-12-18T15:28:34.307 に答える