2008-12-18 64 views
0

這是交易。如何刪除其他進程使用的文件

我的WinApp正在運行,對吧?讓我們說流程'A'。它創建一個文件並保留句柄(保持文件可以寫入,這是必須的)。
然後啓動其他msbuild過程,我們稱之爲'B'。該過程從System.Diagnostic.Process類開始。
在某些時候,我的WinApp(A)需要刪除先前創建的文件(記住它是由A本身創建的),這就是當我得到一個IOException消息,並顯示消息「進程無法訪問文件'X',因爲它正在被另一個進程使用「。它實際上是!...如果我終止進程'B',只有'A'才能成功刪除文件。

所以我的問題是:
1)有沒有一種方法可以告訴我創建的過程,而不是處理我打開的文件?
2)是否有另一種方法來實現我的場景?

回答

2

看起來像System.Diagnostic.Process.Start調用CreateProcessbInheritHandles參數設置爲true

您可以嘗試在ProcessStartInfo中將UseShellExecute設置爲true,或直接將P/Invoke設置爲CreateProcess

+0

我真的很喜歡這個建議,但不幸的是不工作......我不知道爲什麼B保持由A – sebagomez 2008-12-18 18:24:47

0

可以強制關閉文件句柄而不關閉進程正在使用的句柄,儘管這可能會導致應用程序崩潰。換句話說,做你想做的事情可能會導致'B'崩潰。也就是說,你所要求的肯定是可能的,因爲應用程序Process Explorer可以做到這一點。我在那個鏈接中搜索消息板,你可能會發現它的信息量很大,但即使是找到的行爲哪個應用程序正在使用一個句柄,這是一個沮喪的練習,不必介意真正關閉句柄。

0

我不知道如何保證刪除打開句柄的文件,但是如果您可以等待系統重新啓動以刪除文件,則可以使用Sysinternals的MoveFile實用程序的相同技術。

這個程序添加註冊表值到HKLM \系統\ CurrentControlSet \控制\會話管理器\的PendingFileRenameOperations關鍵的Windows會檢查啓動,這將確保該文件被刪除,雖然不是馬上。

相關問題