我该如何生成一个唯一的文件名或路径?我正在寻找一个既适用于Unix(类似)操作系统又适用于Windows的解决方案。
boost::uuid
库:#include <string>
using std::string;
#include <boost/lexical_cast.hpp>
using boost::lexical_cast;
#include <boost/uuid/uuid.hpp>
using boost::uuids::uuid;
#include <boost/uuid/uuid_generators.hpp>
using boost::uuids::random_generator;
#include <boost/uuid/uuid_io.hpp>
string make_uuid()
{
return lexical_cast<string>((random_generator())());
}
使用生成的UUID作为文件名(因此路径是无关紧要的)。
如其他地方所提到的,有tmpnam
。它通常实现不良,容易导致与其他进程竞争。然而,在典型的单用户计算机上,它通常已经足够。
在我的代码中,我通常会创建一个目录,并且将进程id作为名称的一部分,并安排将所有临时文件放在其中(使用简单的计数器来变化文件名);在共享磁盘上,我也会将处理器id混淆到目录名中(但我倾向于将临时文件放在本地、非共享驱动器上,这避免了大多数问题)。
/dev/random
中读取的一些字节。 - James Kanze最简单的方法:生成一个随机数,并使用其十六进制值作为文件名(除非该文件已存在,在这种情况下,您需要创建一个新文件)。
更简单的方法2:如果您只需要一些不存在的文件,请使用数字(或其十六进制值)作为文件名或其中的一部分,您只需增加该数字,直到没有使用该名称的文件为止。
更复杂的方法:生成GUID并将其用作文件名(再次验证它未被使用)。
您可以获取当前时间戳并将其用作文件名。或者只需将上一个文件名增加1即可。
例如:1.txt,2.txt等。
tmpfile
或tmpnam
。两者在Windows和Linux下都存在。tmpnam
更适合您。tmpnam
本身的问题。如果实现正确,没有理由不使用tmpnam
。(公平地说,它很少以安全的方式实现。但是mkstemp
是Unix特有的,而不是标准C,而tmpfile
不仅创建名称,还将文件作为FILE*
打开,这使其变得相当无用。) - James Kanzetmpnam
可能已经足够了。(为了劫持名称,病毒必须知道它正在生成,并在生成和创建文件之间的非常非常小的时间段内运行。更不用说,在 Unix 下,至少在 Windows 下也是如此,您可以请求如果文件已经存在,则 open
失败。) - James Kanze