我需要编写一个 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库)。
答案 0 :(得分:3)
在所有句柄出现后立即删除该文件 关闭,包括指定的句柄和任何其他打开或 重复的句柄。
如果文件存在打开的句柄,则调用将失败,除非 它们都是以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)
您可以创建一个帮助程序进程来跟踪主进程句柄,并在(任何)主进程终止时尝试删除该文件。如果文件以非共享方式打开(通过记事本或任何人),这可能无论如何都无法完成。