【发布时间】:2020-03-24 10:32:33
【问题描述】:
我需要在特定目录中创建与该目录中所有文件不同名称的新文件。它不必是严格的“c++ 代码”。它甚至可以是我将使用 execve 调用的 bash 或 perl 脚本,但我需要从 c ++ 代码中访问它的名称。
我怎样才能做到这一点?
【问题讨论】:
-
什么操作系统?系统 API 通常提供这样的功能,例如在 Windows 上 GetTempFileName。
我需要在特定目录中创建与该目录中所有文件不同名称的新文件。它不必是严格的“c++ 代码”。它甚至可以是我将使用 execve 调用的 bash 或 perl 脚本,但我需要从 c ++ 代码中访问它的名称。
我怎样才能做到这一点?
【问题讨论】:
您可以使用C++,通过生成一个 32 位或 64 位的 UUID,具体取决于您可能生成的文件数量。
存在许多库,例如 UUID Library 如果您可以嵌入外部库,则带有 boost,或者有基于 C Linux 的函数
【讨论】:
由于您已标记问题gnu 和linux,您可以使用the mkstemp() fucntion:
描述
mkstemp()函数从template,创建并打开文件,返回一个打开的文件 文件的描述符。模板的最后六个字符必须是
"XXXXXX",它们是 替换为使文件名唯一的字符串。既然会 被修改,模板不能是字符串常量,而应该是 声明为字符数组。
例如:
char newFileName[] = "/path/to/new/file/someName.XXXXXX";
int newFileDescriptor = mkstemp( newFileName );
手册页上的 mkstemp() 函数还有其他几种变体,可能更适合您的实际需求。
根据您的文件创建过程的安全性,为新文件创建一个希望唯一的名称,然后确保您打开的文件实际上是您要创建的新文件,而不是换入的其他文件恶意代码并不容易安全地执行 - 有不少漏洞利用代码生成名称然后尝试创建新文件以闯入系统或以其他方式破坏系统之间的固有竞争条件。
请注意,诸如 UUID 之类的构造并不能真正保证是唯一的。如果它们只是随机数,显然不能保证它们是唯一的(尽管发生冲突的几率可能非常小)。如果它们不是真正的随机数,则它们具有可以被恶意代码预测和利用的模式。
如果需要安全性,您最好使用操作系统的工具来创建一个新的、唯一的文件,并为您的代码提供一个打开的文件描述符或该新文件的句柄。
【讨论】:
【讨论】:
gnu 和linux?!?!