boost :: filesystem :: unique_path()如何解决C ++中mkstemp analogue的需求?

时间:2017-05-12 20:37:32

标签: c++ boost temporary-files boost-filesystem

Boost的旧feature request请求类似于mkstemp POSIX功能的功能在Boost.Filesystem中可用。这个问题长期以来已经修复,并附有评论

  

版本3中的unique_path()函数解决了这个问题。

但我没有看到unique_path如何解决问题。它与tmpnam基本相同:在生成名称之后,在创建实际文件之前,另一个程序可能已经创建了具有相同名称的文件。

那么如何解决mkstemp中的需求?

1 个答案:

答案 0 :(得分:1)

我的猜测是,实现(至少在* nix系统上)可以导致openO_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(),这可能会实现类似于我的算法的算法。