使用打开的句柄删除或重命名文件

时间:2011-12-06 21:59:37

标签: winapi

Windows API函数CreateFile功能允许您指定所需的访问权限。有三个选项read, write and delete。如果从CreateFile获取请求删除访问的句柄,那么如何使用返回的句柄删除文件? DeleteFile函数采用文件名,而不是句柄。

大图: 从我的应用程序保存文件时,我首先写出一个临时文件,然后删除“真实”文件并将临时文件重命名为真实姓名。我已经开始看到搜索索引器或反病毒/间谍软件打开文件进行读取但不允许删除的问题。这会导致我的保存在移动文件时失败。我已经更改了我的开放代码以请求删除访问权限,以确保我可以在保存时删除该文件。

这一切都运行正常,但我仍有一个空白,第三方应用程序可以抓取我的文件。由于我对临时文件和真实文件都有一个打开句柄,我一直在寻找一种使用这些句柄执行删除和重命名功能的方法。我能找到的唯一选择是关闭句柄,然后调用DeleteFile和MoveFile函数。实际上我目前正在使用ReplaceFile API函数来执行这些步骤,但它也传入了文件名,除非我先关闭我的句柄,否则它将无法工作。

我仍然需要支持XP并且无法开始使用新的事务文件功能。有没有办法让文件锁定并仍然删除/重命名?

1 个答案:

答案 0 :(得分:10)

在Windows Vista中,有一个功能SetFileInformationByHandle,可以满足您的需求。

在以前的Windows版本中,没有这样的功能,但是你有相同的原生功能,而不是公共功能NtSetInformationFile

我没有使用这些功能的经验,也没有测试它们的Windows机器,因此我无法向您展示代码,但这不应该那么困难。

当然,适用于本机Windows功能的一般免责声明。