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

Я прочитал ответы Каков наилучший способ проверить, существует ли файл в C? (кросс-платформу), но мне интересно, есть ли лучший способ сделать это, используя стандартные библиотеки С++? Предпочтительно, не пытаясь открыть файл вообще.

Оба stat и access в значительной степени не подлежат анализу. Что мне следует использовать #include?

Ответ 1

Используйте boost:: filesystem:

#include <boost/filesystem.hpp>

if ( !boost::filesystem::exists( "myfile.txt" ) )
{
  std::cout << "Can't find my file!" << std::endl;
}

Ответ 2

Будьте внимательны к условиям гонки: если файл исчезнет между проверкой "существует" и временем его открытия, ваша программа неожиданно завершится.

Лучше пойти и открыть файл, проверить на наличие сбоя, и если все хорошо, то сделайте что-нибудь с файлом. Это еще более важно с критически важным кодом.

Подробная информация о безопасности и условиях гонки: http://www.ibm.com/developerworks/library/l-sprace.html

Ответ 3

Я счастливый пользователь и, безусловно, буду использовать решение Андреаса. Но если у вас не было доступа к boost libs, вы можете использовать библиотеку потоков:

ifstream file(argv[1]);
if (!file)
{
    // Can't open file
}

Это не так хорошо, как boost:: filesystem:: существует, так как файл будет фактически открыт... но тогда это обычно следующая вещь, которую вы хотите сделать в любом случае.

Ответ 4

Используйте stat(), если он достаточно кросс-платформенный для ваших нужд. Это не стандарт С++, а POSIX.

В MS Windows есть _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.

Ответ 5

Как насчет access?

#include <io.h>

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

Ответ 6

Я бы передумал, пытаясь выяснить, существует ли файл. Вместо этого вы должны попытаться открыть его (в стандарте C или С++) в том же режиме, который вы собираетесь использовать. Какое использование знает, что файл существует, если, скажем, он не доступен для записи, когда вам нужно его использовать?

Ответ 7

Другая возможность заключается в использовании функции good() в потоке:

#include <fstream>     
bool checkExistence(const char* filename)
{
     ifstream Infield(filename);
     return Infield.good();
}

Ответ 8

NO ТРЕБУЕТСЯ, что было бы излишним.


Используйте stat() (не перекрестная платформа, как упоминалось в pavon), например:

#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...

Другую версию (и ее) можно найти здесь.