Как лучше всего проверить, существует ли файл в C ++? (кроссплатформенный) - PullRequest
95 голосов
/ 06 ноября 2008

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

И stat, и access в значительной степени не могут быть активированы в Google. Что я должен #include, чтобы использовать их?

Ответы [ 10 ]

157 голосов
/ 06 ноября 2008

Использовать boost :: filesystem :

#include <boost/filesystem.hpp>

if ( !boost::filesystem::exists( "myfile.txt" ) )
{
  std::cout << "Can't find my file!" << std::endl;
}
40 голосов
/ 06 ноября 2008

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

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

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

29 голосов
/ 06 ноября 2008

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

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

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

10 голосов
/ 06 ноября 2008

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

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

9 голосов
/ 06 ноября 2008

Как насчет access?

#include <io.h>

if (_access(filename, 0) == -1)
{
    // File does not exist
}
8 голосов
/ 19 июня 2013

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

#include <fstream>     
bool checkExistence(const char* filename)
{
     ifstream Infield(filename);
     return Infield.good();
}
7 голосов
/ 06 ноября 2008

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

3 голосов
/ 28 июля 2016

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


Используйте 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...

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

2 голосов
/ 05 марта 2019

Если ваш компилятор поддерживает C ++ 17, вам не нужно повышать, вы можете просто использовать std::filesystem::exists

#include <iostream> // only for std::cout
#include <filesystem>

if (!std::filesystem::exists("myfile.txt"))
{
    std::cout << "File not found!" << std::endl;
}
0 голосов
/ 27 сентября 2018

Если вы уже используете класс потока входного файла (ifstream), вы можете использовать его функцию fail().

Пример:

ifstream myFile;

myFile.open("file.txt");

// Check for errors
if (myFile.fail()) {
    cerr << "Error: File could not be found";
    exit(1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...