如何创建一个具有唯一名称的文件?

3
我需要在特定目录中创建具有不同名称的新文件,与该目录中的所有文件不同。 它不必严格遵守 "c ++代码"。 它甚至可以是bash或perl脚本,我将使用execve调用该脚本,但我需要从c ++代码访问其名称。
如何实现这一点?

1
什么操作系统?系统API通常提供这样的功能,例如在Windows上使用GetTempFileName - Marek R
3个回答

4
您可以使用 C++ 通过生成 UUID 来生成32位或64位数字,这取决于您要生成的文件数量。许多库都存在,例如如果您可以嵌入外部库,则可以使用带有boost的UUID库,或者使用基于C的Linux函数。

2

既然您标记了问题标签 gnulinux,您可以使用mkstemp()函数

描述

mkstemp()函数从template生成一个唯一的临时文件名,创建并打开该文件,并返回该文件的打开文件描述符。

模板的最后六个字符必须是"XXXXXX",并将其替换为一个使文件名唯一的字符串。由于它将被修改,因此模板不能是字符串常量,而应声明为字符数组。

例如:

char newFileName[] = "/path/to/new/file/someName.XXXXXX";
int newFileDescriptor = mkstemp( newFileName );

在man页面上有几个mkstemp()函数的变体,可能更适合您实际的需求。
根据您的文件创建过程需要多么安全,为新文件创建一个希望独特的名称,然后确保您打开的文件实际上是您要创建的新文件,而不是被恶意代码替换的其他文件,这并不容易安全地完成 - 有许多利用代码生成名称然后尝试创建新文件之间固有的竞争条件来闯入系统或以其他方式妥协它的漏洞。
请注意,UUID等构造实际上不能保证唯一性。如果它们只是随机数,显然不能保证它们是唯一的(尽管发生碰撞的可能性可能非常小)。如果它们不是真正的随机数,则具有可以被恶意代码预测和利用的模式。
如果需要安全性,最好使用操作系统的功能来创建新的唯一文件,并为该新文件提供打开的文件描述符或句柄。

1
你可以使用UUID来创建名称。参考this
一个适用于Windows的问题可能也有所帮助。

2
一个同时标记有 gnulinux 的问题,竟然提供了一个指向 Microsoft Windows 函数的链接?!? - Andrew Henle
糟糕!我没看到 Linux 标签。这里是一个适用于 Linux 的 Boost 库 UUID 链接:https://www.boost.org/doc/libs/1_65_0/libs/uuid/uuid.html - Gaurav Kalele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接