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.

62
demandé sur Drew Chapin 2009-09-05 19:37:59

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.

81
répondu Kim Gräsman 2013-08-28 08:54:46

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.

23
répondu Adam Badura 2012-10-09 05:04:37

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.

11
répondu Pablo Santa Cruz 2009-09-05 15:43:12

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.

9
répondu neoneye 2009-09-05 15:47:28

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
}
3
répondu Vadzim 2016-08-05 07:22:25

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
}
2
répondu Drew Chapin 2012-08-14 19:11:09

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 .

1
répondu Roi Danton 2018-06-18 16:51:18

en ce qui concerne l'utilisation de fstat sous windows, je ne suis pas sûr que ce soit ce que vous voulez. De Microsoft le fichier doit être déjà ouvert. Stat devrait fonctionner pour vous.

0
répondu Antoni 2012-06-28 10:28:49