我需要开发一个C ++例程来执行这个显然微不足道的任务:只有在文件不存在时才创建文件,否则什么都不做/引发错误。
由于我需要避免竞争条件,我想使用"请求宽恕而不是许可"原则(即尝试预期的操作并检查是否成功,而不是提前检查前提条件),据我所知,这是用于此目的的唯一可靠且可移植的方法[Wikipedia article] [an example with getline]。 / p>
但是,在我的案例中,我找不到实现它的方法。我能想到的最好的方法是在fstream
模式下打开app
(或fopen
与"a"
),用tellp
检查输出位置(C ++ )或ftell
(C)并在此类位置不为零时中止。这有两个缺点,即如果文件存在则会被锁定(虽然时间很短)并且其修改日期会被更改。
我检查了ios_base::openmode
的{{1}}的其他可能组合,以及fstream
的{{1}}字符串,但没有找到符合我需要的选项。进一步搜索C和C ++标准库以及Boost Filesystem,证明是无用的。
有人可以指出一种方法以强大的方式执行我的任务(没有附带效果,没有竞争条件)而不依赖于OS特定的功能吗? 我的具体问题是在Windows中,但便携式解决方案将是首选。
编辑:BitWhistler的答案完全解决了C程序的问题。不过,我很惊讶没有C ++惯用解决方案似乎存在。任何一个都使用mode
和Andrew Henle提出的fopen
属性,但这是特定于操作系统的(在Windows中,该属性似乎被称为open
,带有一个额外的下划线{{3}或者一个单独编译C11文件并从C ++代码链接它。此外,获得的文件描述符不能转换为流,除非使用非标准扩展(例如GCC' O_EXCL
)。我希望C ++的未来版本将实现_O_EXCL
子属性,并且可能还有相应的__gnu_cxx::stdio_filebuf
文件流修改器。
答案 0 :(得分:3)
新的C标准(C2011,不是C ++的一部分)增加了一个新的标准子规范(" x"),可以附加到任何" w"说明符(形成" wx"," wbx"," w + x"或" w + bx" /" wb + X&#34)。如果文件存在,此子选择器会强制函数失败,而不是覆盖它。