An old 功能要求 https://svn.boost.org/trac/boost/ticket/590对于 Boost 来说,请求的功能类似于mkstemp http://pubs.opengroup.org/onlinepubs/009695399/functions/mkstemp.htmlPOSIX 函数在 Boost.Filesystem 中可用。该问题早已解决并发表评论
版本 3 中的 unique_path() 函数解决了这个问题。
但我不明白如何unique_path
解决问题。基本上是一样的tmpnam http://en.cppreference.com/w/cpp/io/c/tmpnam:在生成名称之后和创建实际文件之前,另一个程序可能已经创建了同名的文件。
那么它应该如何解决这个需求mkstemp
?
我的猜测是,实现(至少在 *nix 系统上)可能会导致有效地调用open
with 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++ API。
请注意,在线程中,他们将函数重命名为generate_random_filename()
,考虑到它是不可预测的,这是更合适的,但不能保证是唯一的。但也建议一个create_unique_file()
,它可能会实现类似于我的示例的算法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)