void get_type(mode_t st_mode){ //判断文件类型
if(S_ISREG(st_mode)){
putchar('-');
}
if(S_ISDIR(st_mode)){
putchar('d');
}
if(S_ISCHR(st_mode)){
putchar('c');
}
if(S_ISBLK(st_mode)){
putchar('b');
}
if(S_ISFIFO(st_mode)){
putchar('p');
}
if(S_ISLNK(st_mode)){
putchar('l');
}
if(S_ISSOCK(st_mode)){
putchar('s');
}
}
void get_permission(mode_t st_mode){ //判断文件权限
for(int i=0;i<=8;i++){
if(st_mode & (0400>>i)){
if(i==0 || i==3 || i==6){
putchar('r');
}
if(i==1 || i==4 || i==7){
putchar('w');
}
if(i==2 || i==5 || i==8){
putchar('x');
}
}else{
putchar('-');
}
}
printf(" ");
}
void get_lnk(struct stat s){ //获取硬链接数
printf("%ld ",s.st_nlink);
}
void get_username(uid_t uid){ //获取文件所属主名
struct passwd* pwd=getpwuid(uid);
printf("%s ",pwd->pw_name);
}
void get_groupname(gid_t gid){ //获取文件所属组名
struct group* gp=getgrgid(gid);
printf("%s ",gp->gr_name);
}
void get_filewords_num(struct stat s){ //获取文件大小
printf("%ld ",s.st_size);
/*
struct stat s; //方法2 形参变成char* path
stat(path,&s);
if(S_ISDIR(s.st_mode)){
return;
}
FILE* f=fopen(path,"r+");
if(f==NULL){
perror("fgetc_fopen");
return;
}
int count=0;
while(1){
if(fgetc(f)==EOF){
break;
}
count++;
}
printf("%d ",count);
fclose(f);
*/
}
void get_lasttime(struct stat s){ //获取文件最后修改时间
time_t t;
struct tm* fmt;
t=(time_t)s.st_mtime;
fmt=localtime(&t);
printf("%d %d %02d:%02d:%02d ",fmt->tm_mon+1,fmt->tm_mday,fmt->tm_hour,fmt->tm_min,fmt->tm_sec);
}
void print_ll(char *dpath){ //打印目录和文件属性信息
DIR *d=opendir(dpath);
if(d==NULL){
perror("opendir");
return;
}
struct dirent *res;
struct stat s;
while((res=readdir(d))!=NULL){ //readdir返回值指向下一个目录,文件入口
chdir(dpath); // 切换目录
if(stat(res->d_name,&s)!=0){
perror("stat");
return;
}
if(res->d_name[0]=='.'){ //去除隐藏文件 . ..
continue;
}
get_type(s.st_mode);
get_permission(s.st_mode);
get_lnk(s);
get_username(s.st_uid);
get_groupname(s.st_gid);
get_filewords_num(s);
get_lasttime(s);
printf("%s",res->d_name);
printf("\n");
}
}
int main(int argc,char *argv[]){
print_ll(argv[1]);
return 0;
}
IO 利用stat相关函数实现 ls -l
于 2022-11-09 19:58:11 首次发布
这段代码主要用于解析文件的类型、权限、硬链接数、所属用户和组、文件大小以及最后修改时间。通过`get_type`、`get_permission`等函数展示文件详细信息,适用于Linux系统。在`print_ll`函数中遍历指定目录下的非隐藏文件并打印其属性。
摘要由CSDN通过智能技术生成