2009-09-15 106 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实例”,这也使得很多其他用户也可以长期使用)。