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

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

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

8 ответов


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

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

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


можно использовать импульс.Файловая система. У него есть .

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


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

в Linux / Unix / MacOSX вы можете использовать функцию fstat.

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

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


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


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

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

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

вам понадобится Shlwapi.lib библиотека, и Shlwapi.h заголовочный файл.

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

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

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

C++17, кросс-платформенный: проверьте наличие файла с std::filesystem::exists и читаемость с std::filesystem::status & std::filesystem::perms:

#include <iostream>
#include <filesystem> // C++17
namespace fs = std::filesystem;

/*! \return True if owner, group and others have read permission,
            i.e. at least 0444.
*/
bool IsReadable(const fs::path& p)
{
    std::error_code ec; // For noexcept overload usage.
    auto perms = fs::status(p, ec).permissions();
    if ((perms & fs::perms::owner_read) != fs::perms::none &&
        (perms & fs::perms::group_read) != fs::perms::none &&
        (perms & fs::perms::others_read) != fs::perms::none
        )
    {
        return true;
    }
    return false;
}

int main()
{
    fs::path filePath("path/to/test.txt");
    std::error_code ec; // For noexcept overload usage.
    if (fs::exists(filePath, ec) && !ec)
    {
        if (IsReadable(filePath))
        {
            std::cout << filePath << " exists and is readable.";
        }
    }
}

рассмотрим также проверку на тип файла.


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