Каков наилучший способ проверить, существует ли файл в C++? (межплатформенный)
Я прочитал ответы для как лучше всего проверить, существует ли файл в C? (кросс-платформенный), но мне интересно, есть ли лучший способ сделать это с помощью стандартных библиотек c++? Желательно вообще не пытаться открыть файл.
и stat и access в значительной степени ungoogleable. Что я должен #include чтобы использовать их?
9 ответов:
использовать boost:: filesystem:
#include <boost/filesystem.hpp> if ( !boost::filesystem::exists( "myfile.txt" ) ) { std::cout << "Can't find my file!" << std::endl; }
будьте осторожны с условиями гонки: если файл исчезнет между проверкой "существует" и временем его открытия, ваша программа неожиданно завершится неудачей.
лучше пойти и открыть файл, проверить на отказ и если все хорошо, то сделать что-то с файлом. Это еще более важно с критически важным для безопасности кодом.
подробная информация о безопасности и условиях гонки: http://www.ibm.com/developerworks/library/l-sprace.html
Я счастливый пользователь boost и, безусловно, использовать решение Андреаса. Но если у вас не было доступа к библиотекам boost, вы можете использовать библиотеку stream:
ifstream file(argv[1]); if (!file) { // Can't open file }это не так хорошо, как boost::filesystem::существует, так как файл будет фактически открыт...но тогда это обычно следующее, что вы хотите сделать в любом случае.
используйте stat (), если он достаточно кросс-платформенный для ваших нужд. Однако это не стандарт C++, а POSIX.
в MS Windows есть _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
Я бы пересмотрел, пытаясь выяснить, существует ли файл. Вместо этого вы должны попытаться открыть его (в стандартном C или C++) в том же режиме, в котором вы собираетесь его использовать. Какой смысл знать, что файл существует, если, скажем, он не доступен для записи, когда вам нужно его использовать?
нет boost требуются С перебор.
использовать stat () (не кросс-платформенный, хотя, как упоминалось Павоном), например:
#include <sys/stat.h> #include <iostream> // true if file exists bool fileExists(const std::string& file) { struct stat buf; return (stat(file.c_str(), &buf) == 0); } int main() { if(!fileExists("test.txt")) { std::cerr << "test.txt doesn't exist, exiting...\n"; return -1; } return 0; }выход:
C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt ls: test.txt: No such file or directory C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp C02QT2UBFVH6-lm:~ gsamaras$ ./a.out test.txt doesn't exist, exiting...другая версия (и это) можно найти здесь.
Если вы уже используете класс потока входных файлов (
ifstream), вы можете использовать свою функциюfail().пример:
ifstream myFile; myFile.open("file.txt"); // Check for errors if (myFile.fail()) { cerr << "Error: File could not be found"; exit(1); }
Comments