3

如何生成唯一的文件名或路径?我正在寻找一种适用于 Unix(类)操作系统和 Windows 的解决方案。

4

6 回答 6

6

利用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 作为文件名(因此路径无关紧要)。

于 2012-08-16T08:39:48.570 回答
5

对两者都使用 mktemp。Windows 在msdn docs上有一个版本的 posix 调用,而 linux 调用是mktemp(3)。linux上的mktemp命令行工具偶然只是调用它

于 2012-08-16T08:29:09.417 回答
2

正如在其他地方提到的,有tmpnam. 它通常实现得很差,以允许与其他进程竞争条件。然而,在典型的单用户机器上,这通常就足够了。

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

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

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

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

于 2012-08-16T08:29:41.070 回答
0

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

于 2012-08-16T08:30:02.223 回答
0

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

但请注意,使用 tmpfile 时,它​​会在您关闭程序时自动删除,因此可能tmpnam更适合您。

于 2012-08-16T08:31:42.117 回答