Как проверить, существует ли файл и читается в С++?

У меня есть fstream my_file ( "test.txt" ), но я не знаю, существует ли test.txt. Если он существует, я хотел бы знать, могу ли я его прочитать. Как это сделать?

Я использую Linux.

Ответ 1

Я бы, вероятно, пошел:

ifstream my_file("test.txt");
if (my_file.good())
{
  // read away
}

Метод good проверяет, готов ли поток к чтению.

Ответ 2

Вы можете использовать Boost.Filesystem. Он имеет функцию boost::filesystem::exist.

Я не знаю, как насчет проверки прав доступа на чтение. Вы можете посмотреть в Boost.Filesystem. Однако, вероятно, не будет другого (портативного) способа, чем попытаться фактически прочитать файл.

Ответ 3

Что такое операционная система/платформа?

В Linux/Unix/MacOSX вы можете использовать fstat.

В Windows вы можете использовать GetFileAttributes.

Обычно нет портативного способа сделать это со стандартными функциями ввода-вывода C/С++.

Ответ 4

если вы находитесь в unix, тогда access() может сказать вам, является ли он доступным для чтения. Однако, если ACL используется, тогда он становится более сложным, в этом случае лучше всего просто открыть файл с помощью ifstream и попробовать прочитать. Если вы не можете прочитать, ACL может запретить чтение.

Ответ 5

Так как С++ 11 можно использовать неявный оператор bool вместо good():

ifstream my_file("test.txt");
if (my_file) {
  // read away
}

Ответ 6

Я знаю, что плакат в конце концов сказал, что они используют Linux, но я удивлен, что никто не упомянул о вызове API PathFileExists() для Windows.

Вам нужно будет включить библиотеку Shlwapi.lib и заголовочный файл Shlwapi.h.

#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>

функция возвращает значение BOOL и может быть вызвана так:

if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
    // do something
}

Ответ 7

Что касается использования fstat в Windows, я не уверен, что это то, что вы хотите. Из Microsoft файл должен быть уже открыт. Stat должен работать для вас.