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


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

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

8 62

8 ответов:

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

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

The 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>

функция возвращает a 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 файл должен быть уже открыт. стат должно работать для вас.