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

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

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

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

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

18

Решение

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

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

18

Другие решения

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

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

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

2

По вопросам рекламы [email protected]