Как создать файл с уникальным именем? - PullRequest
3 голосов
/ 24 марта 2020

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

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

Ответы [ 3 ]

4 голосов
/ 24 марта 2020

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

2 голосов
/ 24 марта 2020

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

ОПИСАНИЕ

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

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

Например:

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

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

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

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

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

1 голос
/ 24 марта 2020

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

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

...