在尝试使用DeleteFile之前,有没有办法确定是否可以删除文件。我只是想测试DeleteFile是否会成功而不会真正删除文件。我想要做的是创建一个文件的硬链接,如果它没有被使用,并在没有FILE_SHARE_DELETE的情况下复制它(在系统中有一个句柄,在它上面打开了WILE_SHARE_DELETE标志)。
谢谢!
答案 0 :(得分:1)
免责声明:我对Windows编程一无所知。但是我看了文档。
根据CreateFile
的MSDN文档,您可以在dwDesiredAccess
参数中指定DELETE
,如果访问权限不是CreateFile
则会导致OPEN_EXISTING
调用失败可用。 (如果您实际上并不想创建新文件,也可以为dwCreationDisposition
指定FILE_SHARE_DELETE
。)这应该涵盖您的用例。
然而,值得指出的是有竞争条件;您可以进行此测试,然后在您有机会对结果采取行动之前,其他人可能会在没有{{1}}的情况下打开该文件。因此,为了让测试变得有意义,您需要了解更多关于文件生命周期的信息,而不是您提到的问题(您确实可能知道这些信息;提及它时,确实没有必要,所以如果你做,只是忽略这一段。)
答案 1 :(得分:1)
谢谢大家的回答。最后经过3天的搜索(2天后我在这里发布了我的问题),我发现我需要了。在开始(3天前)我认为DELETE标志足以进行测试,但它不起作用 - 即使在没有FILE_SHARE_DELETE标志的系统中打开另一个句柄,我仍然能够打开句柄。无论如何,从这里开始我设法找到最终的解决方案 - 使用FILE_FLAG_DELETE_ON_CLOSE创建一个CreateFile - 如果我收到一个有效的句柄而不是文件是可删除的。在使用带有FILE_DISPOSITION_INFORMATION的NtSetInformationFile关闭句柄之前,我删除了FILE_FLAG_DELETE_ON_CLOSE,这样我就可以避免在关闭句柄时删除文件。事实上,我确实可以控制该文件的生命周期 - 这意味着在我进行测试后没有人应该在没有SHARE_DELETE的情况下打开它 - 至少不是我控制的过程应该足够我应该做的事情。