Как проверить, если файл существует и читается в 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."; } } }
рассмотрим также проверку на тип файла.