Überprüfen Sie, ob Unterordner Linux existieren
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?
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:
- Über den Inhalt des Verzeichnisses iterieren Glob mit dem GNU-spezifischen
GLOB_ONLYDIR
Flagge, oder Scandir, oder Readdir. - 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üfenstruct dirent.d_type
: wenn esDT_DIR
dann ist es eine Datei und wenn es so istDT_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 :(