Comment vérifier si un fichier existe et est lisible en C++?
j'ai un fstream my_file("test.txt"), mais je ne sais pas si test.txt existe. Dans le cas où il existe, je voudrais savoir si je peux le lire, trop. Comment faire?
J'utilise Linux.
8 réponses
je dirais probablement:
ifstream my_file("test.txt");
if (my_file.good())
{
// read away
}
la méthode good
vérifie si le flux est prêt à être lu.
vous pouvez utiliser Boost.Système de fichiers . Il a une fonction boost::filesystem::exist
.
Je ne sais pas comment vérifier les droits d'accès en lecture. Vous pouvez regarder dans Boost.Le système de fichiers aussi. Cependant probable qu'il y aura pas d'autre (portable) que d'essayer de lire le fichier.
quel système D'exploitation/plate-forme?
sous Linux/Unix/MacOSX, vous pouvez utiliser fstat .
sur Windows, vous pouvez utiliser GetFileAttributes .
en général, il n'y a pas de méthode portable pour faire cela avec les fonctions C/C++ IO standard.
si vous êtes sous unix alors access () peut vous dire si c'est lisible. Cependant, si les ACL sont utilisés, cela devient plus compliqué, dans ce cas, il est préférable d'ouvrir le fichier avec ifstream et essayer de lire.. si vous ne pouvez pas lire les LCA peut interdire la lecture.
depuis C++11 Il est possible d'utiliser implicitement operator bool au lieu de good()
:
ifstream my_file("test.txt");
if (my_file) {
// read away
}
je sais que l'affiche a finalement dit qu'ils utilisaient Linux, mais je suis un peu surpris que personne n'ait mentionné l'appel D'API PathFileExists()
Pour Windows.
vous devrez inclure les fichiers d'en-tête Shlwapi.lib
et Shlwapi.h
.
#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>
la fonction renvoie une valeur BOOL
et peut être appelée ainsi:
if( PathFileExists("C:\path\to\your\file.ext") )
{
// do something
}
C++17, cross-platform: vérifier l'existence du fichier avec std::filesystem::exists
et la lisibilité avec 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.";
}
}
}
envisager également la vérification pour le type de fichier .