C readdir()对于子目录不能正常工作
我有一个使用readdir的函数。我使用stat获取我作为参数给出的目录中的文件信息 文件夹名称[]实际上是我要读取的目录的绝对路径 该函数适用于类似的名称。或者./lfac,但对于像./lfac/comp这样的名称,它不能正常工作。我测试了它,它从那个目录中读取了一些文件,但不是全部。可执行文件位于根目录中 我有另一个递归函数,它也使用readdir并存储一个列表,其中包含作为参数给出的目录及其子目录中的文件的绝对路径。这个函数也有同样的问题C readdir()对于子目录不能正常工作,c,readdir,C,Readdir,我有一个使用readdir的函数。我使用stat获取我作为参数给出的目录中的文件信息 文件夹名称[]实际上是我要读取的目录的绝对路径 该函数适用于类似的名称。或者./lfac,但对于像./lfac/comp这样的名称,它不能正常工作。我测试了它,它从那个目录中读取了一些文件,但不是全部。可执行文件位于根目录中 我有另一个递归函数,它也使用readdir并存储一个列表,其中包含作为参数给出的目录及其子目录中的文件的绝对路径。这个函数也有同样的问题 void content(char folder_
void content(char folder_name[], char *answer)
{
DIR *diropen;
struct dirent *dirread;
if ((diropen = opendir(folder_name)) == NULL)
{
printf ("Error opening directory %s\n",folder_name);
exit(EXIT_FAILURE);
}
while ((dirread = readdir (diropen)) != NULL)
{
struct stat sb;
memset(&sb, 0, sizeof sb);
char *temp;
temp = (char*) malloc (sizeof(char));
temp[0] = 0;
sprintf(temp,"%s/%s",folder_name,dirread->d_name);
if(strcmp(dirread->d_name,".")==0 || strcmp(dirread->d_name,".")==0)
continue;
if (stat(temp, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
strcat(answer,"File name: ");
strcat(answer,dirread->d_name);
strcat(answer,"\n");
strcat(answer,"File type: ");
switch (sb.st_mode & S_IFMT) {
case S_IFBLK: strcat(answer,"block device\n"); break;
case S_IFCHR: strcat(answer,"character device\n"); break;
case S_IFDIR: strcat(answer,"directory\n"); break;
case S_IFIFO: strcat(answer,"FIFO/pipe\n"); break;
case S_IFLNK: strcat(answer,"symlink\n"); break;
case S_IFREG: strcat(answer,"regular file\n"); break;
case S_IFSOCK: strcat(answer,"socket\n"); break;
default: strcat(answer,"unknown?\n"); break;
}
sprintf(temp,"I-node number: %ld\n", (long) sb.st_ino); strcat(answer,temp);
.......
}
}
你正在用沉重的靴子践踏你的计算机内存,因此你会有未定义的行为 这部分
char *temp;
temp = (char*) malloc (sizeof(char));
temp[0] = 0;
sprintf(temp,"%s/%s",folder_name,dirread->d_name);
每个sizeofchar只分配1字节的内存,但接下来要做的就是向其中写入更长的字符串
您需要分配更多的资源—至少是文件夹路径的长度,加上分隔符,再加上允许的最大文件名长度。您可以使用一些常量,例如MAX_FILE_PATH,但这些常量依赖于编译器和系统;我通常用一些足够大的东西,比如1024
但我不太清楚为什么要在循环中分配内存。主要是因为你没有在任何地方释放它,所以我不知道预期的范围。您可以在循环之前执行此操作,然后还可以使用
char temp[1024];
而不是动态分配。看看这段代码,看看它是否对您有帮助:如果strcmpdirread->d|u name,.==0 | | strcmpdirread->d|u name,.==0,则它会递归删除文件夹。这应该检查一下。而且..在xfs上,st_模式没有正确填写,所以如果需要通用方法,可能需要调用stat。对于像./lfac/comp这样的名称,它不能正常工作到底是什么意思?您的代码不会递归到子目录中,因此无法显示子目录的内容…我终于发现了问题!功能不是问题所在。我以错误的方式动态分配变量answer char*malloc sizeofchar;我分配了更多的空间,现在它适用于所有情况。