linux完成与ls -l相同功能程序

#include <stdio.h>
#include <sys/types.h>//stst函数的头文件
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>//exit函数的头文件
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h> 
#include <string.h>
void File_Type(char argv[]);
int main(int argc,char **argv)
{
	struct stat st;//文件属性对应的结构体
	DIR *dp;
	struct dirent *dep;
	char path_name[100];
	if(argc != 2){
		fprintf(stderr,"请输入正确的参数\n");
		exit(1);
	}
	
	stat(argv[1],&st);
	//输出文件类型
	if(S_ISREG(st.st_mode)){
		//fprintf(stdout,"-");//普通文件
		File_Type(argv[1]);//如果是普通文件就直接显示文件属性
	}
	else if(S_ISDIR(st.st_mode)){
		//fprintf(stdout,"d");//目录
		dp = opendir(argv[1]);
		if(dp == NULL){
			fprintf(stderr,"读取目录失败\n");
			exit(1);			
		}
		while((dep=readdir(dp)) != NULL){
			if(dep->d_name[0]=='.'){//遇到隐藏文件就跳过
				continue;
			}
			//这里一定要取出来路径,不然使用readdir函数仅仅是读取名字而已
			if(argv[1][strlen(argv[1])-1] == '/'){//如果传进来的目录后面有/
				sprintf(path_name,"%s%s",argv[1],dep->d_name);
				//printf("%s\n",path_name);//打印出所有的目录文件
			}else{//如果传进来的目录后面没有/
				sprintf(path_name,"%s/%s",argv[1],dep->d_name);
			}
			//printf("%s\n",path_name);//打印出所有的目录文件
			File_Type(path_name);
		}
	}
	return 0;
}
void File_Type(char argv[])
{
	struct stat st;//文件属性对应的结构体
	struct tm *Tm;//时间对应的结构体
	char Mode[4]="xwr-";
	char i;
	stat(argv,&st);
	//输出文件类型
	if(S_ISREG(st.st_mode))
		fprintf(stdout,"-");//普通文件
	else if(S_ISDIR(st.st_mode))
		fprintf(stdout,"d");//目录		
	else if(S_ISCHR(st.st_mode))
		fprintf(stdout,"c");//字符文件
	else if(S_ISBLK(st.st_mode))
		fprintf(stdout,"b");//块
	else if(S_ISFIFO(st.st_mode))
		fprintf(stdout,"p");//管道文件
	else if(S_ISLNK(st.st_mode))
		fprintf(stdout,"l");//链接文件
	else if(S_ISSOCK(st.st_mode))
		fprintf(stdout,"s");//套接字
	//输出文件权限
	for(i=8;i>=0;i--){
		if(st.st_mode & (0x01<<i)){
			printf("%c",Mode[i%3]);
		}else{
			printf("-");
		}
	}
	//输出文件硬链接数
	fprintf(stdout," %-4u",st.st_nlink);
	//输出文件拥有者
	fprintf(stdout,"%-10s",getpwuid(st.st_uid)->pw_name);
	//输出文件所属组
	fprintf(stdout,"%-10s",getgrgid(st.st_gid)->gr_name);
	//输出文件大小
	fprintf(stdout,"%-10ld ",st.st_size);
	//输出文件最后修改时间
	Tm = localtime(&st.st_mtime);
	fprintf(stdout,"%-2d%-2d %02d:%02d",Tm->tm_mon+1,Tm->tm_mday,Tm->tm_hour,Tm->tm_min);
	//输出文件名
	//fprintf(stdout,"  %s\n",argv);
	i=strlen(argv);//去除包含有/的路径,只罗列文件名
	while(i--){
		if(argv[i]=='/')	break;
	}
	printf("	%s\n",&argv[i+1]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值