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