Каков наилучший способ проверить, существует ли файл в C++? (межплатформенный)



Я прочитал ответы для как лучше всего проверить, существует ли файл в C? (кросс-платформенный), но мне интересно, есть ли лучший способ сделать это с помощью стандартных библиотек c++? Желательно вообще не пытаться открыть файл.



и stat и access в значительной степени ungoogleable. Что я должен #include чтобы использовать их?

1967   9  

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.

как о access?

#include <io.h>

if (_access(filename, 0) == -1)
{
    // File does not exist
}

другая возможность заключается в использовании

Я бы пересмотрел, пытаясь выяснить, существует ли файл. Вместо этого вы должны попытаться открыть его (в стандартном 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

    Ничего не найдено.