54 Stimmen

Wie kann ich feststellen, ob ein gegebener Pfad ein Verzeichnis oder eine Datei ist? (C/C++)

Ich verwende C, und manchmal muss ich Pfade behandeln wie

  • C:\Whatever
  • C:\Whatever\
  • C:\Whatever\Somefile

Gibt es eine Möglichkeit zu prüfen, ob ein bestimmter Pfad ein Verzeichnis oder eine Datei ist?

127voto

Stat() wird Ihnen dies mitteilen.

struct stat s;
if( stat(path,&s) == 0 )
{
    if( s.st_mode & S_IFDIR )
    {
        //it's a directory
    }
    else if( s.st_mode & S_IFREG )
    {
        //it's a file
    }
    else
    {
        //something else
    }
}
else
{
    //error
}

4 Stimmen

Das einzige Problem, das ich mit diesem Code habe, ist der Kommentar im Fall else. Nur weil etwas kein Verzeichnis ist, heißt das noch lange nicht, dass es eine Datei ist.

0 Stimmen

@dicroce: Ja, das stimmt; korrigiert.

0 Stimmen

Wenn ich versuche, dies zu verwenden, erhalte ich "Aggregat 'main(int, char**)::stat s' hat einen unvollständigen Typ und kann nicht definiert werden", und ich konnte wirklich nicht herausfinden, was der Fehler ist. Es gibt Fehler zuerst in der Zeile von struct stat s; Was könnte mein Fehler sein?

35voto

Colen Punkte 12848

Rufen Sie an. GetFileAttributes und suchen Sie nach dem Attribut FILE_ATTRIBUTE_DIRECTORY.

3 Stimmen

Wenn Sie Windows 98 unterstützen müssen, dann können Sie diese Funktion nicht verwenden. Siehe meine Antwort über PathIsDirectory unten, wenn Sie Win98-Unterstützung benötigen.

35voto

Roi Danton Punkte 6655

Mit C++14/C++17 können Sie die plattformunabhängige is_directory() y is_regular_file() von der Dateisystem-Bibliothek .

#include <filesystem> // C++17
#include <iostream>
namespace fs = std::filesystem;

int main()
{
    const std::string pathString = "/my/path";
    const fs::path path(pathString); // Constructing the path from a string is possible.
    std::error_code ec; // For using the non-throwing overloads of functions below.
    if (fs::is_directory(path, ec))
    { 
        // Process a directory.
    }
    if (ec) // Optional handling of possible errors.
    {
        std::cerr << "Error in is_directory: " << ec.message();
    }
    if (fs::is_regular_file(path, ec))
    {
        // Process a regular file.
    }
    if (ec) // Optional handling of possible errors. Usage of the same ec object works since fs functions are calling ec.clear() if no errors occur.
    {
        std::cerr << "Error in is_regular_file: " << ec.message();
    }
}

In C++14 verwenden std::experimental::filesystem .

#include <experimental/filesystem> // C++14
namespace fs = std::experimental::filesystem;

Weitere implementierte Kontrollen sind aufgeführt in Abschnitt "Dateitypen" .

0 Stimmen

Hallo @Roi Danton, danke für Ihre Antwort. Wissen Sie, warum dies nicht auf macOS funktioniert? Es scheint, dass es mit Clang zusammenhängt, das diese Bibliothek nicht unterstützt. Sehr unglücklich, IMO.

1 Stimmen

@mannyglover Clang unterstützt std::filesystem Stellen Sie sicher, dass Sie Clang 7 oder höher mit der Option -std=c++17 . Minimales Beispiel im Compiler-Explorer .

14voto

jeffm Punkte 3040

Unter Win32 verwende ich normalerweise PathIsDirectory und ihre Schwesterfunktionen. Dies funktioniert in Windows 98, was GetFileAttributes nicht tut (laut MSDN-Dokumentation).

1 Stimmen

Ich habe es nicht ausprobiert, aber die früheste dokumentierte Version wurde mit Windows 95 ausgeliefert, also wahrscheinlich nicht.

5 Stimmen

Sie können sicher verwenden GetFileAttributes() in Windows 98, und AFAIK war es schon vor der Existenz von PathIsDirectory() . Sie können sich nicht auf die MSDN-Dokumentation verlassen, wenn Sie die Mindestanforderungen an das Betriebssystem einer API überprüfen, denn MSDN lügt! Wenn MS die Unterstützung für eine Betriebssystemversion einstellt, werden die meisten Verweise darauf aus der MSDN-Dokumentation entfernt, insbesondere bei den Mindestanforderungen an das Betriebssystem für bestehende APIs.

2voto

Scott Punkte 756

Unter Windows können Sie Folgendes verwenden GetFileAttributes an einem Griff öffnen .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X