Ich verwende Glib in meiner Anwendung, und ich sehe, es gibt Convenience-Wrapper in Glib für C remove
, unlink
und rmdir
. Diese funktionieren jedoch nur für eine einzelne Datei oder ein Verzeichnis gleichzeitig.Wie gehe ich ein Verzeichnis in C
Soweit ich sehen kann, enthalten weder der C-Standard noch Glib irgendeine Art von rekursiven Directory-Walk-Funktionalität. Ich sehe auch keine spezifische Möglichkeit, einen gesamten Verzeichnisbaum auf einmal zu löschen, wie mit rm -rf
.
Für das, was ich tue, mache ich mir keine Sorgen über irgendwelche Komplikationen wie Berechtigungen, Symlinks sichern den Baum (unendliche Rekursion), oder alles, was eine sehr naive Implementierung ausschließen würde ... also bin ich nicht abgeneigt, meine eigene Funktion dafür zu schreiben.
Allerdings bin ich neugierig, ob diese Funktionalität irgendwo in den Standardbibliotheken gtk oder glib (oder in einer anderen leicht wiederzuverwendenen C-Bibliothek) bereits vorhanden ist und ich einfach nicht darüber gestolpert bin. Wenn Sie dieses Thema googlen, werden viele falsche Leads generiert.
Ansonsten mein Plan ist, diese Art von Algorithmus zu verwenden:
dir_walk(char* path, void* callback(char*) {
if(is_dir(path) && has_entries(path)) {
entries = get_entries(path);
for(entry in intries) { dir_walk(entry, callback); }
}
else { callback(path) }
}
dir_walk("/home/user/trash", remove);
Offensichtlich ich in einem gewissen Fehlerbehandlung bauen würde und dergleichen um den Vorgang abzubrechen, sobald ein schwerwiegender Fehler aufgetreten ist.
technisch nur 'remove()' ist in der C-Norm, die anderen 2 sind POSIX :) –
Gut zu wissen, danke. – mlibby
Zusätzlich zu den vorhandenen Antworten, bitte beachten Sie, dass man nicht einfach * ein Verzeichnis * nach Mordor laufen lässt, sei es in C oder einer anderen Sprache. –