wake-up-neo.net

Wie kann ich überprüfen, ob eine Datei existiert und in C++ lesbar ist?

Ich habe ein fstream my_file ("test.txt"), weiß aber nicht, ob test.txt existiert. Falls es existiert, würde ich gerne wissen, ob ich es auch lesen kann. Wie geht das?

Ich benutze Linux.

62
Jerry

Ich würde wahrscheinlich mit gehen:

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

Die good -Methode prüft, ob der Stream zum Lesen bereit ist.

82
Kim Gräsman

Sie könnten Boost.Filesystem verwenden. Es hat eine boost::filesystem::exist-Funktion.

Ich weiß nicht, wie ich die Lesezugriffsrechte prüfe. Sie könnten auch in Boost.Filesystem suchen. Es ist jedoch wahrscheinlich, dass es keine andere (tragbare) Möglichkeit gibt, als die Datei tatsächlich zu lesen.

22
Adam Badura

Welches Betriebssystem/welche Plattform?

Unter Linux/Unix/MacOSX können Sie fstat verwenden.

Unter Windows können Sie GetFileAttributes verwenden.

Mit den Standardfunktionen von C/C++ IO ist dies normalerweise nicht tragbar.

11

wenn Sie sich unter Unix befinden, kann access () Ihnen sagen, ob es lesbar ist. Wenn jedoch ACLs verwendet werden, wird es komplizierter. In diesem Fall ist es am besten, die Datei mit ifstream zu öffnen und zu lesen. Wenn Sie nicht lesen können, kann das Lesen der ACL das Lesen verhindern.

10
neoneye

Seit C++ 11 ist es möglich, implizit operator bool anstelle von good() zu verwenden:

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

Ich weiß, das Poster sagte schließlich, dass sie Linux verwendeten, aber ich bin irgendwie überrascht, dass niemand den PathFileExists() API-Aufruf für Windows erwähnt hat. 

Sie müssen die Shlwapi.lib-Bibliothek und die Shlwapi.h-Header-Datei einfügen. 

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

die Funktion gibt einen BOOL-Wert zurück und kann wie folgt aufgerufen werden:

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

C++ 17, plattformübergreifend: Überprüfen Sie das Vorhandensein von Dateien mit std::filesystem::exists und die Lesbarkeit mit 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.";
        }
    }
}

Überprüfen Sie auch den Dateityp .

2
Roi Danton

Bei der Verwendung von fstat in Windows bin ich mir nicht sicher, ob es das ist, was Sie wollen. Von Microsoft muss die Datei bereits geöffnet sein. Stat sollte für Sie arbeiten.

0
Antoni