Boost的旧feature request请求类似于mkstemp POSIX功能的功能在Boost.Filesystem中可用。这个问题长期以来已经修复,并附有评论
版本3中的unique_path()函数解决了这个问题。
但我没有看到unique_path
如何解决问题。它与tmpnam基本相同:在生成名称之后,在创建实际文件之前,另一个程序可能已经创建了具有相同名称的文件。
那么如何解决mkstemp
中的需求?
答案 0 :(得分:1)
我的猜测是,实现(至少在* nix系统上)可以导致open
与O_EXCL | O_CREAT
有效地调用,基本上说“创建文件,如果它已经存在,则返回错误
因此,实现可以有这样的算法:
for(;;) {
name = create_likley_unique_name();
file = open(name, O_EXCL | O_CREAT, mode);
if(valid(file)) {
return file;
}
}
这当然只是猜测,但我认为这是合理的。我不知道windows或osx是否有相似的标志。
我认为您链接的页面上“解决方案”的关键部分是这一部分:
建议的修复方法是(1)重命名函数和(2)提供 如何使用fstreams甚至C I / O安全地使用该函数的示例。 请参阅下面的建议措辞。
如果一个正确的例子就像我刚写的那样,但是使用等效的c ++ ish API。
请注意,在线程中,它们将函数重命名为generate_random_filename()
,这更合适,因为它是不可预测的,但不能保证是唯一的。但是也建议使用create_unique_file()
,这可能会实现类似于我的算法的算法。