web-dev-qa-db-fra.com

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. Si cela existe, j'aimerais savoir si je peux le lire aussi. Comment faire ça?

J'utilise Linux.

62
Jerry

J'irais probablement avec:

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.

82
Kim Gräsman

Vous pouvez utiliser Boost.Filesystem . 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.Filesystem aussi. Cependant, il est probable qu'il n'y aura pas d'autre moyen (portable) que d'essayer de lire le fichier.

22
Adam Badura

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

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

Sous Windows, vous pouvez utiliser GetFileAttributes .

En général, il n’ya pas de moyen portable de faire cela avec les fonctions standard C/C++ IO.

11
Pablo Santa Cruz

si vous êtes sous unix, alors access () pourra vous dire s'il est lisible. Cependant, si les ACL sont en cours d'utilisation, cela devient alors plus compliqué. Dans ce cas, il est préférable d'ouvrir le fichier avec ifstream et d'essayer de lire. Si vous ne pouvez pas lire, l'ACL peut interdire la lecture.

10
neoneye

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
}
5
Vadzim

Je sais que l'affiche a fini par indiquer qu'ils utilisaient Linux, mais je suis un peu surpris que personne n'ait mentionné l'appel API PathFileExists() pour Windows. 

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

#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>

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

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

C++ 17, multiplate-forme: Vérifiez 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.";
        }
    }
}

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

2
Roi Danton

En ce qui concerne l'utilisation de fstat dans Windows, je ne sais pas si c'est ce que vous voulez. De Microsoft le fichier doit être déjà ouvert. Stat devrait travailler pour vous.

0
Antoni