我想编写执行以下操作的代码:
1)打开一个文件(用于写入),如果该文件不存在,则创建该文件。
2)确保文件在运行其他代码时存在(通过保持打开状态)。
3)关闭文件,如果在步骤1中创建了文件,则将其删除。
任何POSIX / C ++ 17 stdlib / boost文件系统功能都可以使此操作变得容易吗?
注意:涉及多个open
调用并且如果在它们之间创建/删除文件时给出无效结果的解决方案不是我想要的。
答案 0 :(得分:0)
由于创建文件的逻辑不同(作为临时文件),因此您可以首先检查文件是否存在。如果未使用O_CREAT | O_EXCL
创建它,并将fd
存储在具有自定义删除器的unique_ptr/shared_ptr
中,该删除器除关闭fd外还删除文件。 O_EXCL
是为了避免导致重复删除的竞争,并确保您实际创建了文件。如果您认为此问题会引起高度争议,则可以检查EEXIST
并在这种情况下重试。如果您碰巧删除了由另一个并行版本的调用打开的临时文件,则该临时文件将一直存在,直到关闭fd。
答案 1 :(得分:0)
我认为这不能以可移植的方式进行处理,您可能不得不诉诸于平台特定的API。
例如,在Windows上,可以将CreateFile()
与CREATE_ALWAYS
标志一起使用,如果文件已成功打开,则随后对GetLastError()
的调用将返回0,而不是{{ 1}},将重新创建文件,因此调用SetFileInformationByHandle(FileDispositionInfo)
以启用文件上的FILE_DISPOSITION_INFO::DeleteFile
标志。这样,当文件的所有打开句柄都关闭时,操作系统会自动将其删除。
然后,如果需要,您可以选择attach the file handle to a std::(i|o)fstream
。