readdir()不能正确处理子目录

时间:2014-12-26 12:59:44

标签: c readdir

我有这个使用readdir()的函数。我使用stat()来获取有关我作为参数提供的目录中的文件的信息。

  

folder_name []实际上是我想要阅读的目录的绝对路径

该功能适用​​于../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);
        .......
    }
}

1 个答案:

答案 0 :(得分:0)

你正在通过计算机的记忆踩踏沉重的靴子,所以你得到了未定义的行为。

这部分

char *temp;
temp = (char*) malloc (sizeof(char));
temp[0] = 0;
sprintf(temp,"%s/%s",folder_name,dirread->d_name);

每个sizeof(char)只分配1个字节的内存,但接下来你要做的就是将 way 更长的字符串写入其中。

您需要分配更多 - 至少与文件夹路径的长度,分隔符以及最大允许的文件名长度一样多。有一些常量,例如你可以使用MAX_FILE_PATH,但这些常量与编译器和系统有关;我经常使用一些东西"肯定足够大,咳嗽咳嗽"例如1024

但是我不清楚为什么你在循环中分配那个内存。 (主要是因为你不能在任何地方释放它,所以我不知道预期的范围。)你可以在你的循环之前做到这一点,然后你也可以使用

char temp[1024];

而不是动态分配。