C S_ISDIR()和S_ISREG()仅在当前目录中正常工作?

C S_ISDIR()和S_ISREG()仅在当前目录中正常工作?,c,C,我正在写一个简单的c程序,它输出给定目录中的所有内容。文件以绿色打印,可执行文件以红色打印,目录以蓝色打印。文件和可执行文件也会打印其大小。当我使用相对路径(“.”)或绝对路径打开当前目录时,代码正常工作。但是,当我打开其他目录时,所有内容都被标识为目录并以蓝色打印。我不确定为什么在打开不同目录时行为会发生变化 #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys

我正在写一个简单的c程序,它输出给定目录中的所有内容。文件以绿色打印,可执行文件以红色打印,目录以蓝色打印。文件和可执行文件也会打印其大小。当我使用相对路径(“.”)或绝对路径打开当前目录时,代码正常工作。但是,当我打开其他目录时,所有内容都被标识为目录并以蓝色打印。我不确定为什么在打开不同目录时行为会发生变化

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

int main(int argc, char *argv[]){
    DIR* dir;
    struct dirent* sd;
    
    dir = opendir(".");

    if(dir == NULL){
        exit(1);
    }
    int fd;
    int size;
    while((sd=readdir(dir)) != NULL){
        struct stat statstruct;
        stat(sd->d_name, &statstruct);
        
        if(S_ISREG(statstruct.st_mode)){
            fd = open(sd->d_name, O_RDONLY);
            size = lseek(fd, 0, SEEK_END);
            if(statstruct.st_mode & S_IXUSR){
                printf("\033[1;31m%s %d bytes\n\033[0m", sd->d_name, size);
            }
            else{
                printf("\033[0;32m%s %d bytes\n\033[0m", sd->d_name, size);
            }
            
        }
        else if(S_ISDIR(statstruct.st_mode)){
            printf("\033[0;34m./%s\n\033[0m", sd->d_name);
        }
        
        
    }

    closedir(dir);

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
DIR*DIR;
结构方向*sd;
dir=opendir(“.”);
if(dir==NULL){
出口(1);
}
int-fd;
整数大小;
而((sd=readdir(dir))!=NULL){
结构statstruct;
统计(sd->d_名称和统计结构);
if(S_ISREG(statstruct.st_模式)){
fd=打开(sd->d_名称,仅限O_);
尺寸=lseek(fd,0,搜索结束);
if(statstruct.st_模式和S_IXUSR){
printf(“\033[1;31m%s%d字节\n\033[0m”,sd->d_名称,大小);
}
否则{
printf(“\033[0;32m%s%d字节\n\033[0m”,sd->d_名称,大小);
}
}
否则如果(S_ISDIR(statstruct.st_模式)){
printf(“\033[0;34m./%s\n\033[0m”,sd->d_名称);
}
}
closedir(dir);
}
stat
相对于当前目录打开。因此,文件将相对于当前目录进行分析。而是相对于您感兴趣的目录打开文件

int err = fstatat(dirfd(dir), sd->d_name, &statstruct, 0);
if (err) abort(); // yes, handle errors

当我打开其他目录时。具体是什么其他目录?你是指相对目录?还是指程序开始所在目录的子目录?请澄清。
stat(sd->d_name,
该路径是相对的。在那里传递完整路径。另外,检查stat()的返回值。这会提示您它正在返回eNONT,并会引导您检查传递给readdir()的路径。您需要检查
stat()中的返回值
,它将告诉您
enoint
。重复的问题解释了如何解决这些问题。是的,这就是问题所在。感谢您的快速回复。
int err = fstatat(dirfd(dir), sd->d_name, &statstruct, 0);
if (err) abort(); // yes, handle errors