在 C 中使用 Glob() 列出目录中的文件

List files in directories using Glob() in C

基本上,到目前为止我有这个代码:

#include <glob.h>
#include <string.h>
#include <stdio.h>

# define ERROR 1
# define FAILURE -1

int main(int ac, char **av)
{
  glob_t globlist;
  int i;

  i = 0;               
  if (ac == 1)
    return (-1);
  else
    {
      if (glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_NOSPACE
          || glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_NOMATCH)
        return (FAILURE);
      if (glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_ABORTED)
        return (ERROR);
      while (globlist.gl_pathv[i])
        {
          printf("%s\n", globlist.gl_pathv[i]);
          i++;
        }
    }
  return (0);
}

例如,当我键入 ./a.out "*" 时,它会打印我所在位置的所有文件以及目录,但不会打印目录中的内容。我应该如何打印所有文件,包括 sub-files/folders?

谢谢

如果您想检查整棵树,而不是一个特定的路径和文件名模式,请使用 nftw() instead of glob()

(通过使用 opendir()/readdir()/closedir() 来重新发明轮子绝对是愚蠢的,特别是因为 nftw() 应该优雅地处理文件系统更改,而自旋转树遍历代码通常忽略所有困难的事情,只在你自己的机器上以最佳条件工作,在其他地方以壮观和美妙的方式失败。)

在过滤函数中,使用 fnmatch() 来决定文件名是否可以使用 glob 模式。

如果您希望使用正则表达式进行过滤,请在您的过滤函数中使用 regcomp() to compile the pattern(s) before calling nftw(), then regexec()。 (正则表达式比 glob 模式更强大,它们被编译成一个紧密的状态机,所以它们也非常有效。)

如果您不确定其中的区别,glob patterns and regular expressions 上的维基百科文章非常有用且信息丰富。

以上所有内容均在 POSIX.1-2008 中定义,因此它们可移植到所有 POSIX-y 操作系统。