8

我在我的应用程序中使用 glib,我看到 glib 中有用于Cremove和. 但是这些一次只能处理一个文件或目录。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);

显然,一旦遇到致命错误,我会构建一些错误处理等以中止该过程。

4

5 回答 5

7

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

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

于 2010-02-07T17:24:14.040 回答
5

如果你想用 glib 来做,你可以使用GFileEnumerator 。

于 2010-02-07T17:24:52.810 回答
5

几个平台包括 ftw 和 nftw:“(新)文件树遍历”。检查 imac 上的手册页表明这些是遗留的,新用户应该更喜欢 fts。便携性可能是这些选择中的任何一个的问题。

于 2010-02-07T17:32:37.567 回答
3

标准 C 库旨在提供原始功能。你所说的是复合行为。您可以使用您选择的 API 中的低级特性轻松实现它——请查看本教程

于 2010-02-07T17:21:58.943 回答
-1

请注意,您为 remove()、unlink() 和 rmdir() 提到的“便利包装器”,假设您指的是在 <glib/gstdio.h> 中声明的那些,并不是真正的“便利包装器”。用“g_”作为完全标准函数的前缀有什么方便?(请注意,即使我首先介绍了它们,我也会这么说。)

这些包装器存在的唯一原因是 Windows 上的文件名问题,这些包装器实际上由真实代码组成;它们采用 Unicode 格式的文件名参数,以 UTF-8 编码。相应的“未包装”Microsoft C 库函数采用系统代码页中的文件名。

如果您不是专门编写旨在移植到 Windows 的代码,则没有理由使用 g_remove() 等包装器。

于 2010-02-15T10:46:31.823 回答