如何生成一个唯一的文件名或path?

我怎样才能生成一个唯一的文件名或path? 我正在寻找一种适用于Unix(类似)操作系统和Windows的解决scheme。

使用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作为文件名(路径因此是不相关的)。

两者都使用mktemp。 Windows在MSDN文档中有一个posix调用版本,而linux调用是mktemp(3) 。 Linux上的mktemp命令行工具顺便说一下

正如其他地方所提到的那样, 它往往执行不力,以便与其他进程的竞争条件。 然而,在典型的单用户机器上,这通常是足够的。

在我自己的代码中,我通常会创建一个目录,并将进程ID作为名称的一部分,并安排将所有临时文件放入其中(使用简单的计数器来更改文件名)。 在一个共享的磁盘上,我也把处理器的id改成了目录名(但是我倾向于把临时文件放在本地的,非共享的驱动器上,这样可以避免大部分的问题)。

  • 最简单的方法:生成一个随机数,并使用它的十六进制值作为文件名(除非文件存在,在这种情况下,你创建一个新的)。

  • 最简单的方法2:如果你只是需要一些不存在的文件,使用一个数字(或其十六进制值)作为文件名或其中的一部分,只要增加数字,直到没有该名称的文件已经存在。

  • 更复杂的方法:生成一个GUID并将其用作文件名(再次验证它没有被使用)。

使用C库函数tmpfiletmpnam 。 两者都存在于windows和linux下。

但要小心,当使用tmpfile时,关闭程序时会自动删除,所以也许tmpnam更适合你。

您可以获取当前时间戳并将其用作文件名。 或者只是增加最后的文件名1。
例如1.txt,2.txt等。