我需要开发一个C++例程来执行这个看似微不足道的任务:仅在文件不存在时创建文件,否则不执行任何操作/引发错误。
由于我需要避免竞态条件,我想使用“先行请求原谅不要事先获得许可”的原则(即尝试预期的操作并检查它是否成功,而不是事先检查前提条件),据我所知,这是唯一可靠且可移植的方法[维基百科文章][使用getline的示例]。
然而,我找不到实现它的方法。我能想到的最好的方法是以
我检查了
有人能指出一种在不依赖于特定于操作系统的功能的情况下以稳健方式执行我的任务的方法吗?我的具体问题在Windows中,但是最好使用可移植解决方案。
编辑:BitWhistler的答案完全解决了C程序的问题。仍然令我惊讶的是,似乎不存在符合C++惯用法的解决方案。或者使用Andrew Henle提出的带有
由于我需要避免竞态条件,我想使用“先行请求原谅不要事先获得许可”的原则(即尝试预期的操作并检查它是否成功,而不是事先检查前提条件),据我所知,这是唯一可靠且可移植的方法[维基百科文章][使用getline的示例]。
然而,我找不到实现它的方法。我能想到的最好的方法是以
app
模式打开fstream
(或者用"a"
打开fopen
),使用tellp
(C ++)或ftell
(C)检查输出位置,并在该位置不为零时中止。但是,这有两个缺点,即如果文件存在,则会被锁定(虽然只有短时间)并且其修改日期会更改。我检查了
fstream
的其他可能的ios_base::openmode
组合,以及fopen
的mode
字符串,但没有找到适合我的需求的选项。进一步在C和C ++标准库以及Boost Filesystem中搜索均无结果。有人能指出一种在不依赖于特定于操作系统的功能的情况下以稳健方式执行我的任务的方法吗?我的具体问题在Windows中,但是最好使用可移植解决方案。
编辑:BitWhistler的答案完全解决了C程序的问题。仍然令我惊讶的是,似乎不存在符合C++惯用法的解决方案。或者使用Andrew Henle提出的带有
O_EXCL
属性的open
(但在Windows中,该属性似乎称为带有额外下划线的_O_EXCL
[MSDN]),或者单独编译一个C11文件并从C ++代码链接它。此外,获取的文件描述符无法转换为流,除非使用非标准扩展(例如GCC的__gnu_cxx :: stdio_filebuf
)。我希望C ++的未来版本将实现"x"
子属性,可能还会为文件流实现相应的ios ::
修改器。
open( filename, O_CREAT | O_EXCL ... )
可以完成你想要做的事情。 - Andrew Henle