终止进程时是否可以删除文件?

时间:2014-06-27 09:30:36

标签: c windows file-io

我需要编写一个 Windows C应用程序来创建一个文件,并且在终止应用程序时需要删除此文件(在正常终止或强制终止的情况下)。

还有一个要求是用户还应该能够以只读模式打开此文件(可能正在使用记事本)。基本上这将用Java读(即DocumentBuilder :: parse)

我写了以下代码

   HANDLE hFile = CreateFile("d:\\test.xml",                
                   GENERIC_WRITE,          
                   FILE_SHARE_READ,                      
                   NULL,                   
                   CREATE_ALWAYS,             
                   FILE_FLAG_DELETE_ON_CLOSE,  
                   NULL);  

当我在Notepad.exe中打开文件(即test.xml)时,我收到一条错误说"该进程无法访问该文件,因为它正被另一个进程使用"。

但是,以下代码可以正常工作

   HANDLE hFile = CreateFile("d:\\test.xml",                
                   GENERIC_WRITE,          
                   FILE_SHARE_READ,                      
                   NULL,                   
                   CREATE_ALWAYS,             
                   FILE_ATTRIBUTE_NORMAL,
                   NULL);                

但问题是,它不会删除文件(即应用程序被杀死时)。

感谢任何帮助。

如果您可以建议一种适用于Windows和Unix的方法,那就太棒了(例如使用boost库)。

4 个答案:

答案 0 :(得分:3)

documentation说:

  

在所有句柄出现后立即删除该文件   关闭,包括指定的句柄和任何其他打开或   重复的句柄。

     

如果文件存在打开的句柄,则调用将失败,除非   它们都是以FILE_SHARE_DELETE共享模式打开的。

     

对文件的后续打开请求失败,除非   指定了FILE_SHARE_DELETE共享模式。

因此,您需要安排任何打开文件的进程传递FILE_SHARE_DELETE

答案 1 :(得分:2)

这来自我们的代码库:( other answer包含指向文档的链接)

FILE_FLAG_DELETE_ON_CLOSE还会阻止读者,除非他们指定 FILE_SHARE_DELETE

return ::CreateFile(
    filePath, 
    GENERIC_READ | GENERIC_WRITE, // reading and writing
    FILE_SHARE_READ, // Note: FILE_FLAG_DELETE_ON_CLOSE will also block readers, unless they specify FILE_SHARE_DELETE 
    /*Security:*/NULL, 
    CREATE_NEW, // only create if does not exist
    FILE_ATTRIBUTE_TEMPORARY | // optimize access for temporary file
    FILE_FLAG_DELETE_ON_CLOSE, // delete once the last handle has been closed
    NULL);

所以看起来你的标准应用程序运气不好(*),因为(根据我过去的自己的智慧),读者也需要通过FILE_SHARE_DELETE


(*)大多数文件在文本编辑器中打开时都可以删除,但我相信这是因为这些编辑只需在阅读完内容后关闭文件句柄即可。如果他们提供FILE_SHARE_DELETE模式,您可以查看热门的免费模式。

答案 2 :(得分:0)

您可以检查此文件的访问级别:  if(!_tacces(path, 06) //exit application

更多信息abou _tacces:http://msdn.microsoft.com/en-us/library/1w06ktdy.aspx

答案 3 :(得分:0)

您可以创建一个帮助程序进程来跟踪主进程句柄,并在(任何)主进程终止时尝试删除该文件。如果文件以非共享方式打开(通过记事本或任何人),这可能无论如何都无法完成。