我正在用 C++ MFC 在 Windows 下编写一个桌面应用程序。
应用程序创建一个索引文件,并一次又一次地向它写入信息。
如果应用程序崩溃,下次应用程序启动时,它将删除崩溃的索引文件并创建一个新的。我认为在某些情况下,索引文件会被锁定。如果我不能删除锁定的索引文件,那将是一场灾难。
我如何保证我可以删除文件并创建一个新文件?我可以确保没有其他应用程序打开索引文件。它不能仅仅因为应用程序崩溃而被删除。
任何人都可以帮忙吗?
我正在用 C++ MFC 在 Windows 下编写一个桌面应用程序。
应用程序创建一个索引文件,并一次又一次地向它写入信息。
如果应用程序崩溃,下次应用程序启动时,它将删除崩溃的索引文件并创建一个新的。我认为在某些情况下,索引文件会被锁定。如果我不能删除锁定的索引文件,那将是一场灾难。
我如何保证我可以删除文件并创建一个新文件?我可以确保没有其他应用程序打开索引文件。它不能仅仅因为应用程序崩溃而被删除。
任何人都可以帮忙吗?
如果没有进程使文件保持打开状态,那么它就无法保持锁定状态。您可能会发现,只要您崩溃的进程确实死亡(而不是挂起),您就没有问题。
如果您确实需要确保可以在另一个进程打开文件时从一个进程中删除文件,则需要两个进程都使用FILE_SHARE_DELETE
标志打开它。
要解锁文件,您应该关闭与其关联的所有句柄。最好的方法是终止仍在运行(并拥有文件句柄)的崩溃应用程序。
要查找崩溃的应用程序,您可以使用本文中描述的技术。这就是Process Explorer在搜索具有指定名称的文件句柄时所做的事情。
我可以推荐使用这个工具: http: //lockhunter.com/download.htm
它通过删除“%appdata%/Skype/my-user-profile”帮助我在 Windows 8 上解锁了我的 Skype 帐户,而其他工具和程序对我的情况没有帮助(参考“可能存在另一个 Skype 实例”,这也长期困扰着许多其他用户)。
答案很可能是“您无法删除锁定的文件”。操作系统不会让你。
相反,我会用这样的东西来解决它。
奖励积分:允许用户“恢复”崩溃的索引文件,而不是自动删除它们。
有时可以重命名锁定的文件。不过,您可能应该解决真正的问题而不是症状。
对于一次性解决方案,启动到安全模式并将其删除。我的 C: 驱动器上有一个 .exe,当我在编译器中构建它时,它被锁定,没有任何东西可以删除它,包括重新启动。但是,在安全模式下我可以删除它。