如何在C中遍历目录

mli*_*bby 7 c gtk glib directory-walk

我在我的应用程序中使用油腔滑调,我看到有在油嘴滑舌更便利的包装对于C的remove,unlinkrmdir.但这些只能一次在单个文件或目录上工作.

据我所知,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)

显然,一旦遇到致命错误,我会构建一些错误处理等来中止进程.

sta*_*ica 7

你看过了<dirent.h>吗?AFAIK属于POSIX规范,它应该是大多数(如果不是全部)C编译器的标准库的一部分.参见例如<dirent.h>参考(Open Group的Single UNIX specification Version 2).

PS,在有人对此发表评论之前:不,这不提供递归目录遍历.但后来我认为这最好是由开发人员实现的; 需求可以有很大不同,所以一个适合所有的递归遍历函数必须非常强大.(例如:符号链接是否跟进?是否应该限制递归深度?等等)


And*_*Dog 5

如果要使用glib,可以使用GFileEnumerator

  • 不,这不对。可用的教程很少,但是您应该看看http://gezeiten.org/post/2009/04/Writing-Your-Own-GIO-Jobs,其中显示了递归文件列表(搜索“ g_file_deep_count”)。 (2认同)

Wil*_*ell 5

几个平台包括ftw和nftw:"(新)文件树步行".检查imac上的手册页显示这些是遗留的,新用户应该更喜欢fts.可移植性可能是这些选择中的任何一个的问题.