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

时间:2016-06-05 10:59:43

标签: c linux unix path glob

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

#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 "*"时,它会打印我所在的所有文件以及目录,但它不会打印内部目录。我该怎么做才能打印所有文件,包括子文件/文件夹?

由于

1 个答案:

答案 0 :(得分:2)

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

(通过使用opendir()/ readdir()/ closedir()来重新发明轮子是绝对愚蠢的,特别是因为nftw()应该优雅地处理文件系统的变化,而自旋树行走代码通常会忽略所有艰难的东西,只能在你自己的机器上以最佳状态运行,在其他地方以惊人的方式失败。)

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

如果您希望使用正则表达式进行过滤,请在调用nftw()之前使用regcomp()编译模式,然后在过滤函数中使用regexec()。 (正则表达式比glob模式更强大,并且它们被编译为紧密状态机,因此它们也非常有效。)

如果您不确定这些差异,那么glob patternsregular expressions上的维基百科文章非常有用且信息丰富。

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