IO 利用stat相关函数实现 ls -l

这段代码主要用于解析文件的类型、权限、硬链接数、所属用户和组、文件大小以及最后修改时间。通过`get_type`、`get_permission`等函数展示文件详细信息,适用于Linux系统。在`print_ll`函数中遍历指定目录下的非隐藏文件并打印其属性。
摘要由CSDN通过智能技术生成
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值