Что такое эквивалент С++ 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()
- единственная неочевидная часть моего преобразования.
Ответы
Ответ 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
.