使用GetTemp文件名函数在C++上生成随机文件名
Use GetTempFileName function to generate random file name on C++
我想使用 GetTempFileName 函数生成一个随机文件名,但在调用函数时不创建文件本身。我想使用该函数来使用名称本身(并且没有扩展名),以便稍后我可以创建一个具有该特定名称的文件夹。由于没有类似的函数来创建文件夹,我只想获取 GetTempFileName 创建的字符串,以便稍后创建一个文件夹。
LPTSTR wzTemp = new TCHAR[MAX_PATH];
GetTempFileName(strTemp, 0, 0, wzTemp);
CString tempFolder;
tempFolder = wzTemp;
这是我的尝试,但是在GetTemp文件名之后立即创建了文件。
知道我该如何调整吗?
GetTempFileName 负责创建一个文件。如果要创建一个唯一的目录,则必须编写自己的实现。使用GetTempFileName
,然后删除文件,并在其位置创建一个同名目录注定要失败,因为 TOCTOU 竞赛。
创建唯一名称的标准解决方案是使用 GUID 的字符串表示形式。你可以调用UuidCreate,然后调用UuidToString来获取一个。
如果 36 个字符在您的情况下难以处理,则需要基于不太独特的算法(如系统时间)和重试策略编写自己的实现。
例如,下面是一个实现,它使用系统时间的字符串表示形式,表示为 64 位十进制数。这会导致字符串表示形式,最多 19 个字符宽。
#include <Windows.h>
#include <iostream>
#include <string>
#include <system_error>
std::wstring GetTempDir(std::wstring const& root_dir) {
while (true) {
::SYSTEMTIME st{};
::GetSystemTime(&st);
::FILETIME ft{};
if (!::SystemTimeToFileTime(&st, &ft)) {
auto error_code{ ::GetLastError() };
throw std::system_error(error_code, std::system_category(),
"SystemTimeToFileTime()");
}
ULARGE_INTEGER ft_uli{ ft.dwLowDateTime, ft.dwHighDateTime };
auto dir_name{ std::to_wstring(ft_uli.QuadPart) };
auto dir_name_full{ root_dir + dir_name };
if (::CreateDirectoryW(dir_name_full.c_str(), nullptr)) {
return dir_name_full;
}
else {
auto error_code{ ::GetLastError() };
if (error_code != ERROR_ALREADY_EXISTS) {
throw std::system_error(error_code, std::system_category(),
"CreateDirectoryW()");
}
}
}
}
此函数返回它创建的临时目录的完全限定路径,如果不能,则引发异常。它需要根目录的字符串,包括尾随反斜杠。如果目录已经存在,它会继续尝试,直到可以创建目录。
特别要注意的是,没有争用条件。如果函数成功,则目录已创建。
可以调用它,如以下示例所示:
int main() {
wchar_t path[MAX_PATH + 1]{};
::GetTempPathW(_countof(path), path);
auto temp_dir{ GetTempDir(path) };
std::wcout << L"Temporary directory created: " << temp_dir << std::endl;
}
您可以删除文件,从生成的名称中删除扩展名,然后创建文件夹。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 从命令行c++发送文本文件名
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用GetTemp文件名函数在C++上生成随机文件名
- 在C++中使用std::ofstream创建具有随机文件名的文件时出现问题
- 如何从填充.txt文件名的向量中选取随机元素C++
- 生成一个随机文件名,然后创建文件,在c++中