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

Lesezeit: 3 Minuten

Benutzeravatar von DylanJ
DylanJ

Ich benutze C und manchmal muss ich mit Pfaden wie umgehen

  • C:\Was auch immer
  • C:\Was auch immer\
  • C:\Was auch immer\Irgendeine Datei

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

stat() sagt dir das.

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
}

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

    – dicroce

    28. September 2008 um 23:27 Uhr

  • @dicroce: Ja, wahr genug; Fest.

    Mike F

    29. September 2008 um 0:54 Uhr

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

    – meakgoz

    30. März 2015 um 13:40 Uhr

  • Okay, ich musste #include hinzufügen, mein Fehler 🙂

    – meakgoz

    30. März 2015 um 13:54 Uhr

  • Gibt es eine Überladung oder eine ähnliche Funktion, die einen breiten Zeichenpfad unterstützt?

    – mbaros

    31. Juli 2016 um 19:25 Uhr

Anruf GetFileAttributesund suchen Sie nach dem Attribut FILE_ATTRIBUTE_DIRECTORY.

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

    – jeffm

    28. September 2008 um 23:29 Uhr

Benutzeravatar von Roi Danton
Roi Danton

Mit C++14/C++17 können Sie die Plattform unabhängig nutzen is_directory() und is_regular_file() von dem Dateisystembibliothek.

#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();
    }
}

Verwendung in C++14 std::experimental::filesystem.

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

Weitere implementierte Prüfungen sind in aufgelistet Abschnitt “Dateitypen”.

  • Hallo @Roi Danton, danke für deine Antwort. Weißt du, warum das unter macOS nicht funktioniert? Es scheint, dass es damit zusammenhängt, dass Clang diese Bibliothek nicht unterstützt. Sehr schade, IMO.

    – mannyglover

    13. November 2018 um 16:15 Uhr

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

    – Roi Danton

    13. November 2018 um 19:01 Uhr


Benutzeravatar von jeffm
jeffm

In Win32 verwende ich normalerweise PfadIstVerzeichnis und seine Schwesterfunktionen. Dies funktioniert in Windows 98, was GetFileAttributes nicht tut (laut MSDN-Dokumentation).

Unter Windows können Sie verwenden GetFileAttributes auf ein offener Griff.

Dies ist eine einfache Methode mit der GetFileAttributesW Funktion, um zu überprüfen, ob der Pfad ein Verzeichnis unter Windows ist. Wenn der empfangene Pfad ein Verzeichnis- oder Dateipfad sein muss, dann können Sie davon ausgehen, dass es sich um einen Dateipfad handelt, wenn es sich nicht um einen Verzeichnispfad handelt.

bool IsDirectory(std::wstring path)
{
    DWORD attrib = GetFileAttributes(path.c_str());

    if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
        return true;

    return false;
}

Benutzeravatar von anurag-jain
anurag-jain

Wenn Sie verwenden CFile Du kannst es versuchen

CFileStatus status;
    if (CFile::GetStatus(fileName, status) && status.m_attribute == 0x10){
       //it's directory
}

1406390cookie-checkWie kann ich feststellen, ob ein bestimmter Pfad ein Verzeichnis oder eine Datei ist? (C/C++)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy