Я прочитал ответы на вопрос , как лучше всего проверить, существует ли файл на C? (кросс-платформенный) , но мне интересно, есть ли лучший способ сделать это, используя стандартные библиотеки C ++? Желательно вообще без попытки открыть файл.
Оба stat
и access
в значительной степени не могут быть Google. Что мне #include
следует использовать?
Ответы:
Используйте boost :: filesystem :
источник
Будьте осторожны с условиями гонки: если файл исчезнет между проверкой «существует» и временем, когда вы его откроете, ваша программа неожиданно завершится ошибкой.
Лучше пойти и открыть файл, проверить на сбой и, если все в порядке, что-то сделать с файлом. Это еще более важно для критически важного для безопасности кода.
Подробная информация о безопасности и условиях гонки: http://www.ibm.com/developerworks/library/l-sprace.html.
источник
Я счастливый пользователь буста и обязательно воспользуюсь решением Андреаса. Но если у вас не было доступа к библиотекам повышения, вы можете использовать библиотеку потоков:
Это не так хорошо, как boost :: filesystem :: exists, поскольку файл действительно будет открыт ... но тогда это обычно следующее, что вы хотите сделать в любом случае.
источник
Используйте stat (), если он достаточно кроссплатформенный для ваших нужд. Но это не стандарт C ++, а POSIX.
В MS Windows есть _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
источник
Как насчет
access
?источник
Другая возможность заключается в использовании
good()
функции в потоке:источник
Я бы пересмотрел попытку выяснить, существует ли файл. Вместо этого вы должны попытаться открыть его (в стандартном C или C ++) в том же режиме, в котором вы собираетесь его использовать. Какой смысл знать, что файл существует, если, скажем, он не доступен для записи, когда вам нужно его использовать?
источник
ls
программу, похожую на -подобную? Я предполагаю, что исходный плакат здесь вообще не хочет открывать файл. Функция Posix stat должна давать вам информацию о правах доступа к файлу, поэтому она решит эту проблему.Если ваш компилятор поддерживает C ++ 17, вам не нужно ускорение, вы можете просто использовать
std::filesystem::exists
источник
Нет увеличениеТРЕБУЕТСЯ , что было бы излишним .
Используйте stat () (не кроссплатформенный, хотя, как упоминалось Павоном), например:
Вывод:
Другую версию (и ту) можно найти здесь .
источник
Если вы уже используете класс потока входного файла (
ifstream
), вы можете использовать его функциюfail()
.Пример:
источник