【问题标题】:Is it possible to delete a file that is opened by a process under windows?是否可以删除由Windows下的进程打开的文件?
【发布时间】:2010-12-01 22:55:34
【问题描述】:

出于测试和模拟目的,我想删除我的进程当前打开的文件。

CreateFile docs 表示可以在模式 (FILE_SHARE_DELETE) 中打开文件,该模式允许打开句柄指向的文件被其他操作删除。 (而且我已经通过 CreateFile(FILE_SHARE_DELETE) + DeleteFile 尝试并确认了这一点。)

我现在想知道的是,是否有可能以某种方式删除没有上述标志的任何人打开的文件?

据我了解DeleteFile docs 无法使用此功能,因为

如果应用程序尝试删除打开的文件,DeleteFile 函数将失败 用于普通 I/O 或作为内存映射文件。

是否有任何其他方法可以删除已打开但未设置 FILE_SHARE_DELETE 标志的文件?

【问题讨论】:

  • 在某些情况下可以重命名。这在您想要升级/替换它时很有用

标签: c++ windows winapi


【解决方案1】:

没有办法做到这一点。

执行此类操作的最接近的方法是使用MoveFileEx 安排在重启时删除,目标文件名为NULL,并在dwFlags 参数中设置MOVEFILE_DELAY_UNTIL_REBOOT

【讨论】:

    【解决方案2】:

    我不认为有删除此类文件的合法方法。但是,如果您想防弹,请记住有些工具可以从外部关闭您的手柄,然后可以轻松删除文件(Process Explorer 就是这样一种工具,但是有@987654322 @)。如果有人关闭了您打开的文件的句柄,您在尝试使用该句柄时会出错。

    【讨论】:

    • 另外请记住,句柄值可以被回收,所以如果你这样做,可能会发生非常奇怪的事情(至少在理论上)。在排除故障时将其用作最后的手段,而不是作为生产代码的一部分。
    • @Leo Davidson - 是的,我知道...我试图找到 Raymond Chen 的相关帖子,但找不到,所以我留下了这张便条。你有没有读过它?很想添加链接,以供将来参考。
    • 我在想同一篇文章,但我也找不到。 :(
    【解决方案3】:

    您可以查看DeleteFileTransacted ,它允许在关闭时将文件标记为删除。但是如果您想立即删除文件,它不适合您。如果文件没有FILE_SHARE_DELETE 标志,您需要先关闭它,但为此您需要获取文件句柄然后关闭它。但这需要使用代码注入技术。我不知道如何更容易做到。

    【讨论】:

    • 我想和以前一样的问题。 "如果应用程序试图删除为正常 I/O 打开的文件或作为内存映射文件打开的文件,DeleteFileTransacted 函数将失败。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2020-03-17
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    相关资源
    最近更新 更多