Я использую glib в своем приложении и вижу, что в glib есть удобные обёртки для C remove
, unlink
и rmdir
. Но они работают одновременно только с одним файлом или каталогом.
Насколько я вижу, ни стандарт C, ни glib не включают в себя никакой рекурсивной функциональности обхода каталога. Также я не вижу какого-либо конкретного способа удалить все дерево каталогов сразу, как с rm -rf
.
За то, что я делаю, я не беспокоюсь о каких-либо сложностях, таких как разрешения, символические ссылки на дерево (бесконечная рекурсия) или что-либо, что исключает очень наивный
реализация ... так что я не против написания своей собственной функции для него.
Однако мне любопытно, есть ли эта функциональность где-то в стандартных библиотеках gtk или glib (или в какой-либо другой легко повторно используемой библиотеке C), и я просто не наткнулся на это. Поиск в этой теме порождает множество ложных сведений.
В противном случае я планирую использовать этот тип алгоритма:
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);
Очевидно, я бы встроил некоторую обработку ошибок и тому подобное, чтобы прервать процесс, как только возникнет фатальная ошибка.