c++ - boost::filesystem::unique_path() 如何解决 C++ 中 mkstemp 模拟的需求?

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

feature request for Boost 请求类似于 mkstemp 的功能POSIX 函数在 Boost.Filesystem 中可用。该问题已长期关闭,并附有评论

The unique_path() function in Version 3 addresses the problem.

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

那么它应该如何满足 mkstemp 中的需求?

最佳答案

我的猜测是该实现(至少在 *nix 系统上)可能导致使用 O_EXCL | 有效地调用 open O_CREAT,基本上是说“创建文件,如果它已经存在,则返回一个错误。

所以,一个实现可以有这样的算法:

for(;;) {
    name = create_likley_unique_name();
    file = open(name, O_EXCL | O_CREAT, mode);
    if(valid(file)) {
        return file;
    }
}

当然这只是一个猜测,但我认为这是一个合理的猜测。我不知道 Windows 或 OSX 是否有类似的标志。

我认为您链接的页面上“解决方案”的关键部分是这一部分:

The suggested fix is to (1) rename the function and (2) provide an example of how to use the function safely with fstreams or even C I/O. See below for proposed wording.

一个合适的例子应该像我刚刚写的那样,但使​​用等效的 c++ish API。

请注意,在线程中,他们提供将函数重命名为 generate_random_filename(),鉴于它是不可预测的,但不保证是唯一的,这更合适。但也建议使用 create_unique_file(),它可能会实现类似于我的示例的算法。

关于c++ - boost::filesystem::unique_path() 如何解决 C++ 中 mkstemp 模拟的需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43946120/

相关文章:

c++ - MSVC 和 GCC 之间的 vector 行为不同

python - 是否有等同于 python 的 functools.partial 的 C++

c++ - 使用 Boost 1.56.0 编译问题

c++ - 如何在 boost::python 中向模块添加属性?

ruby - 有没有办法使 Ruby 临时文件永久化?

c++ - SFINAE 在重载决议之外?

c++ - 如何从线程函数返回值?

c++ - boost asio tcp 异步读/写

python - 使用 tempfile 在 Flask 中创建 pdf/xls 文档

ruby - 创建一个临时文件而不在 Ruby 中打开它