2009-09-15 107 views
2

我正在C++ MFC中編寫Windows下的桌面應用程序。如何刪除被鎖定的文件?

該應用程序創建一個索引文件,並一次又一次地向其寫入信息。

如果應用程序崩潰,下次應用程序啓動它將刪除崩潰的索引文件並創建一個新的。我認爲在某些情況下,索引文件將被鎖定。如果我無法刪除鎖定的索引文件,那將是一場災難。

如何保證我可以刪除文件並創建新文件?我可以確保沒有其他應用程序打開索引文件。它不能僅僅因爲應用程序崩潰而被刪除。

任何人都可以幫忙嗎?

回答

7

如果沒有進程使文件保持打開狀態,則無法保持鎖定狀態。你可能會發現,只要你的崩潰過程確實死亡(而不是掛起),你就沒有問題。

如果您確實需要確保您可以從一個進程中刪除該文件,而另一個進程打開該進程,則需要兩個進程使用FILE_SHARE_DELETE標誌打開它。

+2

它不完全是真的,如果沒有一個過程打開,那麼它不鎖定。在一些奇怪的情況下,Windows無法失去鎖定。雖然這是一個非常罕見的問題,但我已經看到它發生過很多次,即使在Win 7下也是如此。從來沒有制定過如何重新​​創建它。它似乎只發生在崩潰。 – Goz 2009-09-15 18:20:21

+0

當發生藍屏時,此鎖定可能會發生 – user25749 2009-09-16 01:00:11

+1

如果發現鎖存在句柄關閉和進程終止的問題,我將非常驚訝。如果這樣做,這是操作系統中的一個基本錯誤。要做出該斷言,您需要排除代碼中的錯誤。一個句柄在另一個過程中能夠存活下來嗎?這個過程是真的死了,還是一個調試器讓它活着?在這種情況下,「崩潰」意味着什麼?鑑於你無法複製它,我對這是一個操作系統錯誤的斷言持懷疑態度。 – janm 2009-09-17 02:17:02

0

最有可能的答案是「你不能刪除一個鎖定的文件」。操作系統不會讓你。

相反,我會解決它與這樣的事情。

  • 檢查現有索引文件,如果不存在鎖定,請刪除它們。
  • 創建一個新的索引文件,如果第一個「名稱」被採用,請檢查index01等等,直到找到一個未被使用的索引文件,然後將其作爲您的索引文件執行該程序。
  • 在正常退出時,清除索引文件。

獎勵積分: 允許用戶「恢復」崩潰的索引文件,而不是自動刪除它們。

3

要解鎖文件,您應關閉與其關聯的所有句柄。最好的方法是終止仍在運行的崩潰應用程序(並擁有文件句柄)。

要找到墜毀的應用程序,您可以使用this文章中描述的技術。當您搜索具有指定名稱的文件句柄時,Process Explorer就是這樣做的。

+0

在另一個進程中關閉句柄是一個壞主意。擁有該處理程序的進程並不知道它已關閉,該值可以被重用,然後會出現各種奇怪的問題。 – janm 2009-09-15 13:14:28

+0

如果你打算這樣做,你應該終止這個過程,打開句柄。至少,事情停止而不是以意想不到的方式失敗。 – janm 2009-09-15 13:16:18

+0

是的。如果「崩潰」意味着「終止」,那麼就不需要關閉另一個進程中的句柄,因爲進程已經結束了。如果「崩潰」意味着「不進行轉發」,那麼正確的做法是終止進程,並終止它的打開句柄。如果在不知情的情況下關閉另一個進程中的句柄,則不是正確的做法。 – janm 2009-09-15 13:22:12

0

有時可以重命名鎖定的文件。不過,您應該修復真正的問題,而不是症狀。

0

,我可以推薦使用此工具:通過能夠刪除http://lockhunter.com/download.htm

它幫助我解開在Windows 8我的Skype帳戶「%APPDATA%/ SKYPE /我 - 用戶配置文件」,而其他的工具和程序在我的情況下並沒有幫助(參考「另一個可能存在的skype實例」,這也使得很多其他用戶也可以長期使用)。