Comment vérifier si un fichier existe et est lisible en C ++?

J’ai un fstream mon_fichier (“test.txt”), mais je ne sais pas si test.txt existe. Au cas où cela existe, j’aimerais savoir si je peux le lire aussi. Comment faire ça?

J’utilise Linux.

J’irais probablement avec:

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

La good méthode vérifie si le stream est prêt à être lu.

Vous pouvez utiliser Boost.Filesystem . Il a une fonction boost::filesystem::exist .

Je ne sais pas comment vérifier les droits d’access en lecture. Vous pouvez regarder dans Boost.Filesystem aussi. Bien qu’il n’y ait probablement pas d’autre moyen (portable) que d’essayer de lire le fichier.

Quel système d’exploitation / plate-forme?

Sous Linux / Unix / MacOSX, vous pouvez utiliser fstat .

Sous Windows, vous pouvez utiliser GetFileAtsortingbutes .

Habituellement, il n’y a pas de moyen portable de le faire avec les fonctions d’E / S C / C ++ standard.

Si vous êtes sur Unix, alors access () peut vous dire si c’est lisible. Cependant, si les listes de contrôle d’access sont utilisées, cela devient plus compliqué, dans ce cas, il est préférable d’ouvrir le fichier avec ifstream et d’essayer read.

Depuis C ++ 11, il est possible d’utiliser l’ opérateur implicite bool au lieu de good() :

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

Je sais que l’affiche a finalement déclaré qu’ils utilisaient Linux, mais je suis un peu surpris que personne n’ait mentionné l’appel de l’API PathFileExists() pour Windows.

Vous devrez inclure la bibliothèque Shlwapi.h et le fichier d’en-tête Shlwapi.h .

 #pragma comment(lib, "shlwapi.lib") #include  

la fonction renvoie une valeur BOOL et peut être appelée comme suit:

 if( PathFileExists("C:\\path\\to\\your\\file.ext") ) { // do something } 

C ++ 17, multiplate-forme: vérifier l’existence du fichier avec std::filesystem::exists et la lisibilité avec std::filesystem::status & std::filesystem::perms :

 #include  #include  // C++17 namespace fs = std::filesystem; /*! \return True if owner, group and others have read permission, ie 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."; } } } 

Envisagez également de vérifier le type de fichier .

En ce qui concerne l’utilisation de fstat dans Windows, je ne suis pas sûr que ce soit ce que vous voulez. À partir de Microsoft, le fichier doit être déjà ouvert. Stat devrait fonctionner pour vous.