Как проверить, если файл существует и читается в C++?
У меня есть fstream my_file("тест.txt"), но я не знаю, если тест.тхт существует. Если он существует, я хотел бы знать, могу ли я его прочитать. Как это сделать?
Я использую Linux.
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."; } } }рассмотрим также проверку на тип файла.