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