我试图在Fedora这个代码,但得到No such file or directory
和Permission denied
错误。
如何处理错误并继续扫描文件系统?
如果出现问题,ftw()会崩溃。如何跳过不良条目?
ftw()从path开始/
。
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <ftw.h>
#include <time.h>
FILE * output;
static int display_info(const char * fpath, const struct stat * st, int tflag)
{
switch(tflag){
case FTW_F://ok, file
break;
case FTW_D://ok, directory
break;
case FTW_SL://symlink
return -1;
case FTW_NS://stat failed
return -1;
case FTW_DNR://read failed
return -1;
}
fprintf(output, fpath);
fprintf(output, "\n");
return 0;
}
int main(int argc, char * argv[])
{
time_t t0;
time(&t0);
output = fopen("/home/sad/output.txt", "w");
if(argc < 2){
printf("Usage: %s [path]\n", argv[0]);
return -1;
}
if(ftw(argv[1], display_info, 99) == -1){
perror("???ftw()");
return -1;
}
fclose(output);
time_t t1;
time(&t1);
printf("%.3f seconds\n", difftime(t1, t0));
return 0;
}
每当display_info
无法访问传递给它的路径时,您的代码都会返回-1 ,因此ftw
它应该执行的操作也确实如此-停止遍历。
如果您希望它继续下去,即使在这种情况下,也请继续返回0。
更好的解决方案是使用更新,更高级的功能nftw
。
它将允许您既指定标志以自动忽略动态链接,也允许您的回调函数指定一些不可操作的操作。
例如,您可以要求它忽略无法访问的目录的子级:
case FTW_NS://stat failed
return FTW_SKIP_SUBTREE;
case FTW_DNR://read failed
return FTW_SKIP_SUBTREE;
默认情况下,在几乎所有Linux发行版中,当您从/遍历时,除非以root身份运行或使用,否则某些文件夹将不可访问sudo
。
此外,某些文件将不是真实文件,您可能想利用这个机会FTW_SKIP_SUBTREE
来跳过诸如proc
和的文件夹dev
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句