如何在创建文件之前测试其是否存在

5

我想检查一个文件是否存在。如果不存在,那么我想创建它。顺便说一下,我正在使用Linux。


这个线程可能会有所帮助:https://dev59.com/lHVC5IYBdhLWcg3woStW。如果你想要更跨平台的方式,可以使用Boost Filesystem:http://www.boost.org/doc/libs/1_47_0/libs/filesystem/v3/doc/tutorial.html(查找`exists`函数)。 - wkl
1个回答

17
你不能可靠地这样做。在你检查文件是否存在和创建它之间,另一个进程可能会创建它。
你应该直接创建文件。根据你要做的更大的事情,如果文件已经存在,你可能想选择以下其中一种选项:
- 就地修改先前的内容:open("file", O_RDWR|O_CREAT, 0666) - 删除以前的内容:open("file", O_WRONLY|O_CREAT|O_TRUNC, 0666) - 在先前的内容后追加:open("file", O_WRONLY|O_CREAT|O_APPEND, 0666) - 操作失败:open("file", O_WRONLY|O_CREAT|O_EXCL, 0666) 大部分这些选项,在高级别的iostream接口中都有相应的等效选项。此外,取决于你使用的C++库,还可以有一种将iostream包装在由open得到的文件描述符周围的方法。
另外,我应该提醒你,如果你想要原子地替换文件的内容(使得没有进程看到不完整的文件),唯一的方法是将新内容写入一个新文件,然后使用rename将其移动到旧文件上方。

根据你所使用的C++库,可能还有一种方法可以在open获取的文件描述符周围包装一个iostream。请参阅如何从POSIX文件描述符构造c++ fstream? - Piotr Dobrogost
如果您对fopen的模式字符串感兴趣,要在原地修改内容,请使用fopen("file", "rb+");要删除先前的内容,请使用fopen("file", "wb");要追加到先前的内容,请使用fopen("file", "ab")。如果要在单个fopen调用中进行存在性检查,则似乎不可能。 - tueftl
1
在C++17中,fopen("file", "wx")仅在文件不存在时才添加到_open。 - mikebob

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