我正在对一个在基于 POSIX 的操作系统上遍历文件系统的程序进行单元测试,我无法找到一种方法来使用 NFTW 在没有一堆全局变量的情况下遍历它,所以我正在使用 dirent.h readdir( ) 的解决方案。为了测试递归的逻辑,我创建了这个函数,它向下递归一个目录,但以递归到第二个目录的段错误结束。
int recurse_dir(DIR *directory)
{
struct dirent *direntry = readdir(directory);
while(direntry != NULL)
{
struct stat file;
lstat(direntry->d_name,&file);
if(S_ISDIR(file.st_mode) && strcmp(direntry->d_name,".") != 0 && strcmp(direntry->d_name,"..") != 0)
{
printf("%s:\n",direntry->d_name);
DIR *subdirectory;
subdirectory = opendir(direntry->d_name);
recurse_dir(subdirectory);
closedir(subdirectory);
printf("\n\n");
}
else
{
if(strcmp(direntry->d_name,".") != 0 && strcmp(direntry->d_name,"."))
{
printf("%s\n",direntry->d_name);
}
}
direntry = readdir(directory);
}
}
我用 gdb 对其进行了测试,发现手册页描述为当前文件名的空终止字符串的 d_name 变量填充了看起来像文件名的整个目录流与一堆空值和其他转义符混合的内容。我在下面发布一个示例。我是否误解了 d_name 变量的含义?
.gtkrc-2.0\000\000\bL\f@\000\000\000\000\000\303e0x\261\233-\a \000\b.kshrc\000\000\000\000\000\000\b)\000@\000\000\000\000\000Wa\340\315\366\310y\a\030\000\004src\000\004\037\000@\000\000\000\000\000\030\313\060\232\256\024\245\a \000\004Downloads\000\000\000\004\237\n@\000\000\000\000\000>5\321{\266-\004\t \000\004."...}