在 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 操作系统。
基本上,到目前为止我有这个代码:
#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 操作系统。