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