是否可以删除由Windows下的进程打开的文件?

时间:2010-12-01 11:09:16

标签: c++ windows winapi

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

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

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

据我所知,DeleteFile docs使用此功能是不可能的,如

  

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

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

3 个答案:

答案 0 :(得分:4)

没有办法做到这一点。

最接近这种方法的方法是使用目标文件名为NULL的{​​{3}}和MOVEFILE_DELAY_UNTIL_REBOOT参数中的dwFlags来重新启动计划。< / p>

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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