Frage

Ich versuche zu überprüfen, ob ein Ordner Unterordner hat, ohne seine Kinder zu durchführen, unter Linux. Das nächste, was ich bisher gefunden habe ftw und am ersten Unterordner anhalten - oder verwenden scandir und durch die Ergebnisse filtern. Beide sind jedoch ein Overkill für meine Zwecke, ich möchte einfach ein Ja/Nein.

Unter Windows erfolgt dies durch Anrufe SHGetFileInfo und dann testen dwAttributes & SFGAO_HASSUBFOLDER auf der zurückgegebenen Struktur. Gibt es eine solche Option unter Linux?

War es hilfreich?

Lösung

Die Standardantwort ist anzurufen Stat Überprüfen Sie im Verzeichnis das Feld ST_NLINK ("Anzahl der harten Links"). In einem Standard -Dateisystem ist jedes Verzeichnis garantiert 2 harte Links (harte Links (. und die Verbindung aus dem übergeordneten Verzeichnis zum aktuellen Verzeichnis), sodass jede harte Verbindung über 2 ein Unterverzeichnis angibt (insbesondere das Unterverzeichnis des Unterverzeichnisses .. Link zum aktuellen Verzeichnis).

Nach meinem Verständnis, dass Dateisysteme dies nicht implementieren müssen (siehe z. B., z. Diese Mailingliste Posting), also funktioniert es nicht garantiert.

Ansonsten müssen Sie tun, was Sie tun:

  1. Über den Inhalt des Verzeichnisses iterieren Glob mit dem GNU-spezifischen GLOB_ONLYDIR Flagge, oder Scandir, oder Readdir.
  2. Anruf Stat Bei jedem Ergebnis und überprüfen Sie S_ISDIR(s.st_mode) Um zu überprüfen, ob Dateien gefunden wurden, sind Verzeichnisse. Oder nicht portabel überprüfen struct dirent.d_type: wenn es DT_DIR dann ist es eine Datei und wenn es so ist DT_UNKNOWN, Sie müssen es doch statieren.

Andere Tipps

Die Möglichkeiten, die Sie (sowie E.James) erwähnt haben, scheinen mir besser für ein Shell -Skript als ein C ++ - Programm zugeschnitten zu sein. Vorausgesetzt, das "C ++" -Tag war beabsichtigt, wäre es wahrscheinlich besser, wenn Sie die POSIX -API direkt verwenden:

// warning: untested code.
bool has_subdir(char const *dir) { 
    std::string dot("."), dotdot("..");
    bool found_subdir = false;    
    DIR *directory;

    if (NULL == (directory = opendir(dir)))
        return false;

    struct dirent *entry;
    while (!found_subdir && ((entry = readdir(directory)) != NULL)) {
        if (entry->d_name != dot && entry->d_name != dotdot) {
            struct stat status;
            stat(entry->d_name, &status);
            found_subdir = S_ISDIR(status.st_mode);
        }
    }
    closedir(directory);
    return found_subdir;
}

Tut getdirentries Willst du, dass du es tun willst? Ich denke, es sollte nichts zurückgeben, wenn es keine Verzeichnisse gibt. Ich hätte das selbst ausprobiert, aber vorübergehend ohne Zugriff auf eine Linux -Box :(

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top