2009-08-21 39 views
0

我做到以下幾點:的DeleteFile失敗

  1. 複製的可執行文件C:\temp\x.exe

  2. System.Diagnostics.Process.Start啓動可執行文件,然後等待過程中退出,同步通過撥打WaitForExitProcess對象Start返回。

  3. 刪除可執行C:\temp\x.exe

在某些機器上,這個工程很大,但對他人,調用DeleteFile失敗,因爲該文件仍然在使用。因此,似乎一旦WaitForExit返回,它並不意味着Windows已完成EXE。

我在這裏有什麼選擇?顯而易見的是幾毫秒後再次嘗試DeleteFile,在一個循環中,直到刪除成功或循環超時。但是有沒有一種更清晰的方式來等待每個人關閉文件?

回答

1

有幾個原因讓你的EXE在完成執行時仍然可以被鎖定。有些與你的代碼有關,有些與系統有關。我認爲你的代碼的兩個主要原因是:

如何在將exe文件複製到臨時位置時關閉文件流,如果它沒有明確釋放,則釋放時間可能會不時變化。

第二個是即使該過程完成執行並不意味着它在系統透視圖中完成。

第一個可以避免第二個可以在進程列表中被監控但是你仍然有一袋可能的鎖(你的程序並行執行兩次,病毒掃描某個人工清理臨時文件夾,光盤清理嚮導) 。所以我建議要麼重寫程序的邏輯。如果可執行文件是用c#編寫的,則加載二進制文件並執行程序而不是複製文件。

如果由於某種原因每次執行時都需要複製文件,會產生一個低優先級的清理線程。讓它在WaitForExit調用之後嘗試清理,如果失敗再次在x毫秒後再次嘗試,如果再次嘗試在2x之後嘗試,等等。

這就是說我猜他們會(可能是非託管)API調用來查找系統級別上的文件鎖。就我個人而言,我只想讓系統自己找出來,儘管

+0

第一個已被排除;我使用CopyFile,沒有什麼花哨,並且手柄已經正確關閉。它必須是操作系統在幕後執行某些操作,在它關閉執行過程後不久。我實施了重試循環,但我對此感到不滿。我想這可能是一個有趣的事情,用ProcMon等工具進一步調查。 – 2009-08-21 15:42:12