我需要开发一个C++例程来执行这个显然是微不足道的任务:只有在文件不存在时才创建文件,否则什么也不做/引发错误.
由于我需要避免竞争条件,我想使用"请求宽恕不允许"原则(即尝试预期的操作并检查它是否成功,而不是提前检查前提条件),据我所知,这是唯一的用于此目的的强大且可移植的方法[维基百科文章] [getline的一个例子].
不过,在我的案例中,我无法找到实现它的方法.我能想到的最好的是打开一个fstream
in app
模式(或者fopen
用"a"
),用tellp
(C++)或ftell
(C)检查输出位置,如果这个位置不为零,则中止.然而,这有两个缺点,即如果文件存在则它被锁定(尽管很短的时间)并且其修改日期被改变.
我检查的其他可能的组合ios_base::openmode
的fstream
,还有mode
的字符串fopen
,但没有发现这适合我的需求选择.进一步搜索C和C++标准库以及Boost Filesystem,证明是无用的.
有人能否指出一种方法以一种强有力的方式执行我的任务(没有附带效应,没有竞争条件)而不依赖于OS特定的功能?我的具体问题是在Windows中,但便携式解决方案将是首选.
编辑:BitWhistler的答案完全解决了C程序的问题.不过,我很惊讶没有C++惯用解决方案似乎存在.任何一个使用Andrew Henle提出open
的O_EXCL
属性,但是特定于操作系统(在Windows中,属性似乎_O_EXCL
用另外的下划线[MSDN]调用)或者单独编译C11文件并将其从C++代码链接.此外,获得的文件描述符不能转换为流,除非使用非标准扩展(例如GCC __gnu_cxx::stdio_filebuf
).我希望未来的C++版本能够实现子"x"
属性,也可能ios::
实现文件流的相应修改器.