C readdir()对于子目录不能正常工作

C readdir()对于子目录不能正常工作,c,readdir,C,Readdir,我有一个使用readdir的函数。我使用stat获取我作为参数给出的目录中的文件信息 文件夹名称[]实际上是我要读取的目录的绝对路径 该函数适用于类似的名称。或者./lfac,但对于像./lfac/comp这样的名称,它不能正常工作。我测试了它,它从那个目录中读取了一些文件,但不是全部。可执行文件位于根目录中 我有另一个递归函数,它也使用readdir并存储一个列表,其中包含作为参数给出的目录及其子目录中的文件的绝对路径。这个函数也有同样的问题 void content(char folder_

我有一个使用readdir的函数。我使用stat获取我作为参数给出的目录中的文件信息

文件夹名称[]实际上是我要读取的目录的绝对路径

该函数适用于类似的名称。或者./lfac,但对于像./lfac/comp这样的名称,它不能正常工作。我测试了它,它从那个目录中读取了一些文件,但不是全部。可执行文件位于根目录中

我有另一个递归函数,它也使用readdir并存储一个列表,其中包含作为参数给出的目录及其子目录中的文件的绝对路径。这个函数也有同样的问题

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;我分配了更多的空间,现在它适用于所有情况。