旧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/