基本上,到目前为止,我有这段代码:
#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 "*"
时,它会打印我所在的所有文件以及目录,但它不会打印内部目录。我该怎么做才能打印所有文件,包括子文件/文件夹?
由于
答案 0 :(得分:2)
如果要检查整个树,而不是一个特定的路径和文件名模式,请使用nftw()
而不是glob()
。
(通过使用opendir()/ readdir()/ closedir()来重新发明轮子是绝对愚蠢的,特别是因为nftw()应该优雅地处理文件系统的变化,而自旋树行走代码通常会忽略所有艰难的东西,只能在你自己的机器上以最佳状态运行,在其他地方以惊人的方式失败。)
在过滤器函数中,使用fnmatch()
来确定使用glob模式是否可以接受文件名。
如果您希望使用正则表达式进行过滤,请在调用nftw()之前使用regcomp()
编译模式,然后在过滤函数中使用regexec()
。 (正则表达式比glob模式更强大,并且它们被编译为紧密状态机,因此它们也非常有效。)
如果您不确定这些差异,那么glob patterns和regular expressions上的维基百科文章非常有用且信息丰富。
所有上述内容都在POSIX.1-2008中定义,因此它们可以在所有POSIX-y操作系统中移植。