gpt4 book ai didi

linux - 测试目录起诉S_ISDIR,但不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:11 25 4
gpt4 key购买 nike

我正在linux中学习c编程,我写这个是为了输出有关文件和目录的信息,就像标准工具“ls”和“-l”一样,除了宏S_ISDIR之外,一切正常,这是我的代码。另外,我的操作系统是 mint 14 x86_64。

#include<sys/types.h>
#include<time.h>
#include<string.h>
#include<dirent.h>
#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
void do_ls(char []);
void show_file_info(struct stat *t){
printf("mode: %o\n",t->st_mode);
if(S_ISDIR(t->st_mode)==0)
printf("Is a dir\n");
else
printf("Is not a dir\n");
printf("links: %d\n",t->st_nlink);
printf("group: %d\n",t->st_gid);
printf("user: %d\n",t->st_uid);
printf("size: %d\n",t->st_size);
printf("modtime: %s\n",ctime(&t->st_mtime));
}
int main(int num,char *a[]){
if(num==1){
do_ls(".");
}
else{
while(--num){
printf("%s :\n",*++a);
do_ls(*a);
}
}
}
void do_ls(char dirname[]){
DIR *tem=opendir(dirname);
struct dirent *direntp;
struct stat *buf;
char t[256];
if(tem==NULL){
fprintf(stderr,"ls: cannot open %s\n",dirname);
}
else{
while((direntp=readdir(tem))!=NULL){
strcpy(t,dirname);
printf("%s\n",direntp->d_name);
strcat(t,"/");
if(stat(t,buf)==-1){
perror("");
break;
}
else{
show_file_info(buf);
}
}
closedir(tem);
}
}

最佳答案

user1198331关于stat的更正是正确的。通常检查所有系统调用返回值以防止错误是一个很好的做法。

不过,在您的原始代码中,我认为这部分是错误的:

if(S_ISDIR(t->st_mode)==0)
printf("Is a dir\n");
else
printf("Is not a dir\n");

您认为如果 S_ISDIR(t->st_mode) 返回 0,则它是一个目录,但实际上,如果 t 指向的文件不是目录,则 S_ISDIR(t->st_mode) 返回 0。因此,您必须进行反向检查。

关于linux - 测试目录起诉S_ISDIR,但不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14643054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com