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

3
我想编写以下功能的代码:
1)打开一个文件(用于写入),如果文件不存在则创建文件。
2)在运行其他代码时确保文件存在(通过保持文件打开)。
3)关闭文件,并在步骤1期间创建了该文件,则删除该文件。
是否有任何POSIX / C ++17 stdlib / boost文件系统函数可以轻松实现此功能?
注意:不希望使用涉及多个open调用并给出无效结果的解决方案,如果在它们之间创建/删除文件。

也许文件监视可以解决2) https://dev59.com/XHNA5IYBdhLWcg3wgeOk ? 尽管我没有看到任何“POSIX/C++17 stdlib/boost”跨平台包装器。 - R2RT
2个回答

0

由于文件是作为临时文件创建的逻辑不同,您可以首先检查文件是否存在。如果不存在,则使用O_CREAT | O_EXCL创建它,并将fd存储在具有自定义删除器的unique_ptr/shared_ptr中,该删除器除了关闭fd之外还会删除文件。 O_EXCL是为了避免竞争导致重复删除并确保您实际上已创建了文件。如果您希望这个过程高度争用,可以检查EEXIST并在这种情况下重试。如果您意外删除了另一个并行版本调用打开的临时文件,则该文件将一直存在,直到关闭fd。


0

我认为无法以可移植的方式处理此问题,你可能必须使用特定于平台的 API。

例如,在 Windows 上,可以使用CreateFile()CREATE_ALWAYS标志打开文件,如果成功打开文件,并且随后调用GetLastError()返回 0 而不是ERROR_ALREADY_EXISTS,则文件将被重新创建,因此调用SetFileInformationByHandle(FileDispositionInfo) 在文件上启用FILE_DISPOSITION_INFO::DeleteFile标志。这样,当关闭到该文件的所有句柄时,操作系统将自动删除该文件。

如果需要,您可以选择将文件句柄附加到std::(i|o)fstream


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接