这个博客很久没有管过了,今天学了一点unix环境编程,模拟了一个简单的ls -l 命令,从两点多一直写到现在,各种翻书,各种百度,总算是基本上完成了这一伟大的ls命令的阉割版,别的不多说了,脑袋都晕了,直接上代码(虽然代码写的很烂,大牛勿喷),不过注释什么的我觉得应该写的够详细了吧,希望大家能指出各种毛病,大牛能给出些建议
#include<stdio.h> #include<sys/stat.h>//lstat #include<time.h>//gmtime #include<unistd.h> #include<string.h>//strcmp #include<error.h> //errno #include<pwd.h>//getpwuid #include<grp.h>//getgrgid #include <dirent.h>//opendir/readdir/closedir #include <sys/types.h> void file_type(const struct stat *s)//显示文件类型 { if(S_ISDIR(s->st_mode))//判断是否为文件夹 { printf("d"); } else if(S_ISREG(s->st_mode))//判断是否为普通文件 { printf("-"); } else { printf("其他"); } } void file_mode(const struct stat *s)//显示文件权限 { unsigned short int a=0x0100; int i=0; for(i=0;i<9;i++) { if(i%3==0) { if(s->st_mode & a)//判断是否可读 { printf("r"); } else { printf("-"); } a>>=1; } else if(i%3==1)//判断是否可写 { if(s->st_mode & a) { printf("w"); } else { printf("-"); } a>>=1; } else//判断是否可执行 { if(s->st_mode & a) { printf("x"); } else { printf("-"); } a>>=1; } } } void file_show(const struct stat *s,const char *file_name)//显示文件/文件夹信息操作 { file_type(s);//显示文件类型 file_mode(s);//显示文件权限 printf("\t"); printf("%d",s->st_nlink);//显示文件硬链接/目录子目录数 printf("\t"); printf("%s",getpwuid(s->st_uid)->pw_name);//显示文件拥有者 printf("\t"); printf("%s",getgrgid(s->st_gid)->gr_name);//文件拥有者所在组 printf("\t"); printf("%ld",s->st_size);//显示文件大小 printf("\t"); struct tm *t = localtime(&s->st_mtime);//获取最后修改时间 printf("%d月 %d %02d:%02d",t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);//显示最后修改时间 printf(" "); printf("%s",file_name); //printf("%o",s->st_mode); printf("\n"); } void dir_file(const struct stat *s,const char *file_name)//目录文件操作 { DIR *d; unsigned long int size= 0; d = opendir(file_name);//打开目录 if(d) { struct dirent* p; while(p=readdir(d))//读取目录中的文件和目录 { if(p->d_name[0]=='.') { continue;//跳过隐藏文件 } char path[300] = ""; sprintf(path,"%s/%s",file_name,p->d_name);//获得相对路径 struct stat w; lstat(path,&w);//获得文件信息 file_show(&w,p->d_name); size+=w.st_size; } closedir(d);//关闭目录 printf("总用量 %ld\n",size);//文件夹用量 } else { printf("%m");//打印错误信息 } } int main(int argc,char* argv[]) { if(argc<3)//判断参数数量是否正确 { puts("您的输入参数过少\n"); return -1; } if(strcmp(argv[1],"-l"))//判断参数是否正确 { puts("您输入的参数有误"); return -2; } struct stat s;//定义一个接收文件信息的结构体 if(!lstat(argv[2],&s))//读取文件信息,判断是否读取成功 { //printf("%s\n",s.st_mode); if(S_ISDIR(s.st_mode))//判断是否为文件夹 { printf("%s 是目录\n",argv[2]); dir_file(&s,argv[2]); } else if(S_ISREG(s.st_mode))//判断是否为文件 { printf("%s 是一般文件\n",argv[2]); file_show(&s,argv[2]);//显示文件信息 } else { puts("其他文件"); } } else { printf("%m");//打印错误信息 } return 0; }