打开文件,如果不存在则创建,确定是否创建

时间:2019-05-22 03:58:45

标签: c++ filesystems posix c++17 boost-filesystem

我想编写执行以下操作的代码:

1)打开一个文件(用于写入),如果该文件不存在,则创建该文件。

2)确保文件在运行其他代码时存在(通过保持打开状态)。

3)关闭文件,如果在步骤1中创建了文件,则将其删除。

任何POSIX / C ++ 17 stdlib / boost文件系统功能都可以使此操作变得容易吗?

注意:涉及多个open调用并且如果在它们之间创建/删除文件时给出无效结果的解决方案不是我想要的。

2 个答案:

答案 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