Подтвердить что ты не робот

Что такое эквивалент С++ 17 для boost:: filesystem:: unique_path()?

std::filesystem на С++ 17 и std::experimental::filesystem для многих компиляторов pre-С++ 17, основаны на boost::filesystem, и почти все они очевидны для переноса на новый std.

Но я не вижу std::filesystem, эквивалентного boost::filesystem::unique_path().

Есть ли эквивалент в std, который я не замечаю? Или есть рекомендуемый подход, который я должен предпринять, чтобы имитировать реализацию?

Я действительно надеюсь заменить зависимость boost::filesystem, когда мой код замечает, что он компилируется на платформе с поддержкой std::filesystem, а unique_path() - единственная неочевидная часть моего преобразования.

4b9b3361

Ответ 1

unique_path был удален, потому что это был потенциальный вектор атаки для вредоносного ПО. Существует окно возможностей между вызовом unique_path и открытием файла в этом месте, в течение которого какой-либо другой процесс может создать тот же файл. В зависимости от того, что пользователь делает с файлом, это может быть или не быть уязвимостью безопасности. Аналогичная проблема существует с функцией POSIX tmpnam.

Как отмечено в данном обсуждении, этот вопрос будет рассмотрен на следующей итерации Библиотека файловой системы. До тех пор вы можете продолжать использовать Boost.Filesystem, используйте std::tmpnam, представленной в <cstdio>, или используйте более безопасные альтернативы для платформы, такие как mkstemp.

Ответ 2

Насколько я могу судить, на С++ 17 нет точного эквивалента.

Вы точно не указали, что именно вы хотите сделать, но если вам просто нужно хранить временный файл где-нибудь, тогда вы сможете имитировать аналогичную функциональность с помощью std::filesystem::temp_directory_path, которую вы можете добавить с произвольно сгенерированным именем файла ( который вы можете сделать как это, или изменить его соответственно, если вам нужен точный формат именования как boost::filesystem::unique_path())

Или, если вам просто нужно сохранить любой временный файл, вы можете использовать std::tmpfile.