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

iNu*_*ste 3 c unix linux glob path

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Nom*_*mal 7

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

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

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

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

如果您不确定其中的区别,维基百科有关全局模式正则表达式的文章非常有用且内容丰富。

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