【发布时间】:2010-02-07 17:18:27
【问题描述】:
我在我的应用程序中使用 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);
显然,我会构建一些错误处理等,以便在遇到致命错误时立即中止进程。
【问题讨论】:
-
技术上只有
remove()在C标准中,其他2个是POSIX :) -
除了现有的答案,请注意不要简单地将目录遍历目录进入魔多,无论是用 C 还是任何其他语言。
-
除了现有的答案,我想指出健壮的代码不应该使用递归。请改用迭代和堆栈。
标签: c gtk glib directory-walk