Как создать файл с уникальным именем?

Мне нужно создать новый файл в определенном каталоге с именем, отличным от всех файлов в этом каталоге. Это не должно быть строго "c ++ code". Это может быть даже скрипт bash или perl, который я буду вызывать с помощью execve, но мне нужно иметь доступ к его имени из кода C ++.

Как мне этого добиться?

Всего 3 ответа


Поскольку вы пометили вопрос gnu и linux , вы можете использовать mkstemp() :

ОПИСАНИЕ

Функция mkstemp() генерирует уникальное временное имя файла из template , создает и открывает файл и возвращает дескриптор открытого файла для файла.

Последние шесть символов шаблона должны быть "XXXXXX" и они заменяются строкой, которая делает имя файла уникальным. Поскольку он будет изменен, шаблон не должен быть строковой константой, а должен быть объявлен как массив символов.

Например:

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

На странице руководства есть несколько других вариантов функции mkstemp() которые могут лучше соответствовать вашим потребностям.

В зависимости от того, насколько безопасным должен быть процесс создания вашего файла, создайте уникальное имя для нового файла, которое, мы надеемся, затем убедитесь, что открываемый вами файл действительно является новым файлом, который вы намеревались создать, а не каким-либо другим файлом, замененным вредоносным кодом. Безопасное сделать нелегко - было довольно много эксплойтов, в которых используется внутреннее условие гонки между кодом, генерирующим имя, и затем пытающимся создать новый файл, чтобы взломать систему или иным образом скомпрометировать его.

И имейте в виду, что такие конструкции, как UUID, не гарантированно являются уникальными. Если это просто случайные числа, они не могут быть гарантированно уникальными (хотя вероятность столкновения может быть чрезвычайно мала). Если они не являются действительно случайными числами, у них есть шаблон, который может быть предсказан и использован вредоносным кодом.

Если безопасность является требованием, вам лучше всего использовать возможности операционной системы для создания нового уникального файла и предоставления вашему коду дескриптора открытого файла или дескриптора этого нового файла.


Вы можете использовать C++ , генерируя UUID на 32 или 64 битах, в зависимости от того, какое количество файлов вы можете сгенерировать.
Существует много библиотек, например UUID Library с надстройкой, если вы можете встроить внешнюю библиотеку, или есть функции на основе C Linux


Вы можете использовать UUID для создания имени. Взгляни на это

Вопрос , но для окон, также может помочь.