S_ISDIR认为文件是一个目录

时间:2017-01-10 17:41:39

标签: c unix

我正在尝试在目录及其子目录中打印所有文件和文件夹的名称。 问题是文件也被认为是目录?很抱歉发布我的整个代码,但我真的不知道为什么会发生这种情况。谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>

void parcurgere(char path[1000]){

    char aux[1000];
    strcpy(aux, path);

    struct dirent *ent;
    DIR *d = opendir(path);

    while((ent = readdir(d))){

        struct stat my_stat;

        stat(path, &my_stat);
        if(S_ISDIR(my_stat.st_mode) && strcmp(ent->d_name, ".")!=0 && strcmp(ent->d_name, "..")!=0 && strcmp(ent->d_name, ".DS_Store")!=0){
            printf("%s - folder\n", ent->d_name);
            char x[1000];
            strcpy(x, path);
            strcat(x, "/");
            strcat(x, ent->d_name);
            parcurgere(x);
        }
        if(S_ISREG(my_stat.st_mode)){
            printf("%s - fisier\n", ent->d_name);
        }

        strcpy(path, aux);
        //path[strlen(path) - poz] = '\0';
    }
}

int main(){

    char path[1000];
    strcpy(path, ".");

    parcurgere(path);

    return 0;
}

1 个答案:

答案 0 :(得分:4)

您在使用stat()打开的目录上呼叫opendir()

DIR *d = opendir(path);

while((ent = readdir(d))){

    struct stat my_stat;

    stat(path, &my_stat);

所以是的,my_stat的内容表明它是一个目录 - 因为path是一个目录。

您还没有检查stat()的返回代码。这可能会失败,如果您将path更改为stat()readdir()返回的条目,如果stat()失败,您将收到错误的结果。