mli*_*bby 7 c gtk glib directory-walk
我在我的应用程序中使用油腔滑调,我看到有在油嘴滑舌更便利的包装对于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);
Run Code Online (Sandbox Code Playgroud)
显然,一旦遇到致命错误,我会构建一些错误处理等来中止进程.
你看过了<dirent.h>吗?AFAIK属于POSIX规范,它应该是大多数(如果不是全部)C编译器的标准库的一部分.参见例如此<dirent.h>参考(Open Group的Single UNIX specification Version 2).
PS,在有人对此发表评论之前:不,这不提供递归目录遍历.但后来我认为这最好是由开发人员实现的; 需求可以有很大不同,所以一个适合所有的递归遍历函数必须非常强大.(例如:符号链接是否跟进?是否应该限制递归深度?等等)
如果要使用glib,可以使用GFileEnumerator。