$ ll wget
total 544
drwxr-xr-x 3 orisun orisun 4096 2011-12-15 09:48 ./
drwxr-xr-x 65 orisun orisun 4096 2011-12-20 19:45 ../
drwxr-xr-x 11 orisun orisun 4096 2011-08-09 21:55 wget-1.13/
-rw-r--r-- 1 orisun orisun 540756 2011-12-15 09:47 wget.pdf
目录总是不为空,它至少包含两项:.代表当前路径,..代表父路径。
ll命令用于列出一个目录下的文件的详细信息:
下面讨论如何来编程实现ll命令。
文件的很多基本信息都可以通过系统调用lstat来获取,它返回一个结构体:
struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last status change */ };
一个struct stat里面似乎包含了我们编写ll命令所需的所有文件信息,但有些表现形式上还不对。
struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ };
下面给出完整代码。
#include#include #include #include #include #include #include<string.h> void do_ls(char[]); void dostat(char *); void show_file_info(char *,struct stat *); void mode_to_letters(int,char[]); char * uid_to_name(uid_t); char * gid_to_name(gid_t); void main(int argc,char *argv[]){ if(argc==1) do_ls("."); else printf("输入命令./ls即可,不要带任何参数。\n"); } void do_ls(char dirname[]){ DIR *dir_ptr; //路径变量 struct dirent *direntp; //存储路径下一个子项信息的结构体 if((dir_ptr=opendir(dirname))==0) fprintf(stderr,"ls:cannot open %s\n",dirname); else{ while((direntp=readdir(dir_ptr))!=0) dostat(direntp->d_name); closedir(dir_ptr); } } void dostat(char *filename){ struct stat info; if(lstat(filename,&info)==-1) perror("lstat"); else show_file_info(filename,&info); } void show_file_info(char *filename,struct stat *info_p){ char modestr[11]; mode_to_letters(info_p->st_mode,modestr); printf("%-12s",modestr); printf("%-4d",(int)info_p->st_nlink); printf("%-8s",uid_to_name(info_p->st_uid)); printf("%-8s",gid_to_name(info_p->st_gid)); printf("%-8ld",(long)info_p->st_size); time_t timelong=info_p->st_mtime; struct tm *htime=localtime(&timelong); printf("%-4d-%02d-%02d %02d:%02d",htime->tm_year+1990,htime->tm_mon+1,htime->tm_mday,htime->tm_hour,htime->tm_min); printf(" %s\n",filename); } /*这个函数写得不够全面,首先文件类型不全,其次没有考虑suid,sgid,sticky*/ void mode_to_letters(int mode,char str[]){ strcpy(str,"----------"); if(S_ISDIR(mode)) str[0]='d'; if(S_ISCHR(mode)) str[0]='c'; if(S_ISBLK(mode)) str[0]='b'; if(mode & S_IRUSR) str[1]='r'; if(mode & S_IWUSR) str[2]='w'; if(mode & S_IXUSR) str[3]='x'; if(mode & S_IRGRP) str[4]='r'; if(mode & S_IWGRP) str[5]='w'; if(mode & S_IXGRP) str[6]='x'; if(mode & S_IROTH) str[7]='r'; if(mode & S_IWOTH) str[8]='w'; if(mode & S_IXOTH) str[9]='x'; } #include //#include可以出现在代码中的任何位置 char * uid_to_name(uid_t uid){ struct passwd *pw_str; static char numstr[10]; if((pw_str=getpwuid(uid))==NULL){ sprintf(numstr,"%d",uid); //如果没有获得用户名,则直接把uid当作用户名 return numstr; } else return pw_str->pw_name; } #include char * gid_to_name(gid_t gid){ struct group *grp_ptr; static char numstr[10]; if((grp_ptr=getgrgid(gid))==NULL){ sprintf(numstr,"%d",gid); return numstr; } else return grp_ptr->gr_name; }
评论加载中...
|
Copyright@ 2011-2017 版权所有:大连仟亿科技有限公司 辽ICP备11013762-1号 google网站地图 百度网站地图 网站地图
公司地址:大连市沙河口区中山路692号辰熙星海国际2215 客服电话:0411-39943997 QQ:2088827823 42286563
法律声明:未经许可,任何模仿本站模板、转载本站内容等行为者,本站保留追究其法律责任的权利! 隐私权政策声明