Sto usando glib nella mia applicazione, e vedo che ci sono wrapper di convenienza in glib per C remove
, unlink
e rmdir
. Ma questi funzionano solo su un singolo file o directory alla volta.Come camminare una directory in C
Per quanto posso vedere, né lo standard C né glib includono alcun tipo di funzionalità di lettura directory ricorsiva. Né vedo alcun modo specifico per eliminare un intero albero di directory in una volta, come con rm -rf
.
per quello che sto facendo questo io non sono preoccupato per eventuali complicazioni come i permessi, i link simbolici di nuovo l'albero (ricorsione infinita), o qualsiasi cosa che possa escludere una molto ingenuo implementazione ... quindi non sono avverso a scrivere la mia propria funzione per questo.
Tuttavia, sono curioso di sapere se questa funzionalità è già disponibile da qualche parte nelle librerie standard gtk o glib (o in qualche altra libreria C facilmente riusabile) e non mi sono mai imbattuta in essa. Googling su questo argomento genera molti falsi lead.
Altrimenti il mio piano è quello di utilizzare questo tipo di algoritmo:
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);
Ovviamente vorrei costruire in qualche gestione degli errori e simili per interrompere il processo non appena viene rilevato un errore fatale.
tecnicamente solo 'remove()' è nello standard C, gli altri 2 sono POSIX :) –
Buono a sapersi, grazie. – mlibby
Oltre alle risposte esistenti, tieni presente che non è sufficiente * percorrere una directory * in Mordor, sia in C che in qualsiasi altra lingua. –