C:<sys stat.h =“”>函数S_ISLNK,S_ISDIR和S_ISREG表现得很奇怪?</sys>

时间:2014-03-14 01:43:01

标签: c file-type ls

这是从编译好的代码。它在一个目录中打印文件名,前面有一个字母选项:dflo,具体取决于文件类型(其他o)。但是,我在目录/etc/network上测试了它,该目录有一个名为run的符号文件,它显示为d?我也尝试重新安排if-statements的顺序,但这也给出了令人不满意的输出。我使用不正确吗?

while ((ent = readdir (dp)) != NULL) {
    lstat(ent->d_name, &st);
    if (col){
            if(S_ISDIR(st.st_mode)){
                    printf("d\t");
                    }
           else if (S_ISREG(st.st_mode)){
                    printf("f\t");
                    }
            else if (S_ISLNK(st.st_mode)){
                    printf("l\t");
            }
            else {   
                     printf("o\t");   
            }
    }

2 个答案:

答案 0 :(得分:4)

在此行中:lstat(ent->d_name, &st);dp->d_name仅包含文件名,您需要将文件的完整路径传递给lstat(),如下所示:

    char full_path[512] = "DIR_PATH"; //make sure there is enough space to hold the path.
    strcat(full_path, ent->d_name);
    int col = lstat(full_path, &st);

BTW,S_ISDIRS_ISLNK等是POSIX宏,而不是函数。

答案 1 :(得分:2)

这可能是另一种解决方案:

if(col){

            if(ent->d_type == DT_DIR)
                printf("d ");
            else if(ent->d_type == DT_LNK)
                printf("l ");
            else if(ent->d_type == DT_REG)
                printf("f ");
        }