基本實現了明令ls -l的功能,能顯示列表,但還有如下缺陷:結果沒有排序,不能顯示總大小,不能顯示其他目錄下的文件列表。
程序中使用了掩碼的技術來實現數值到文件類型、文件權限列表字符串的轉換,使用命令getpwuid(uid_t uid)將用戶id轉換為名子,使用getgrgid(gid_t gid)將組id轉換為組名。
下面是代碼:
??1?#include?<stdio.h>
??2?#include?<sys/types.h>
??3?#include?<sys/stat.h>
??4?#include?<dirent.h>
??5?#include?<string.h>
??6?
??7?void?do_ls(char[]);
??8?void?dostat(char?*);
??9?void?show_file_info(char?*filename,?struct?stat?*buf);
?10?void?mode_to_letters(int,?char[]);
?11?char?*uid_to_name(uid_t);
?12?char?*gid_to_name(gid_t);
?13?
?14?main(int?ac,?char?*av[])
?15?{
?16???if?(ac?==?1)
?17???????do_ls(".");
?18???else
?19???????while(--ac)
?20???????{
?21?????????printf("%s:?\n",?*++av);
?22?????????do_ls(*av);
?23???????}
?24?}
?25?
?26?void?do_ls(char?dirname[])
?27?{
?28???/*
?29????*?list?files?in?directory?called?dirname
?30????*/
?31????
?32???DIR?*dir_ptr;?????????????//the?directory
?33???struct?dirent?*direntp;???//each?entry
?34???
?35???if(?(dir_ptr?=?opendir(dirname))?==?NULL)
?36??????fprintf(stderr,?"ls1:cannot?open?%s\n",?dirname);
?37???else
?38???{
?39?????while?(?(direntp?=?readdir(dir_ptr))?!=?NULL)
?40?????????dostat(direntp->d_name);
?41?????
?42?????closedir(dir_ptr);
?43???}
?44???
?45?}
?46?
?47?
?48?void?dostat(char?*filename)
?49?{
?50???struct?stat?info;
?51???if?(stat(filename,?&info)?==?-1)
?52??????perror(filename);
?53???else
?54??????show_file_info(filename,?&info);
?55?}
?56?
?57?void?show_file_info(char?*filename,?struct?stat?*buf)
?58?{
?59???/*
?60????*?display?some?info?stat?in?a?name?=?value?formant
?61????*/
?62????char?*uid_to_name(uid_t);
?63????char?*?ctime(time_t?*);
?64????char?*?gid_to_name(gid_t),?filemode();
?65????//void?mode_to_letters();
?66????char?modestr[11];
?67????
?68????mode_to_letters(buf->st_mode,?modestr);
?69????
?70????printf("%s",?modestr);
?71????printf("%4d",??buf->st_nlink);
?72????printf("%-8s",???uid_to_name(buf->st_uid));
?73????printf("%-8s",??gid_to_name(buf->st_gid));
?74????printf("%8ld",???(long)buf->st_size);
?75????//printf("modtime:%d\n",buf->st_mtime);
?76????printf("%.12s",4+ctime(&buf->st_mtime));
?77????printf("%s\n",?filename);??
?78????
?79?}
?80?
?81?/*
?82??*?utility?functions
?83??*/
?84?
?85?void?mode_to_letters(int?mode,?char?str[])
?86?{
?87???strcpy(str,?"----------");
?88???
?89???if(S_ISDIR(mode))?str[0]?=?'d';
?90???if(S_ISCHR(mode))?str[0]?=?'c';
?91???if(S_ISBLK(mode))?str[0]?=?'b';
?92???
?93???if(mode?&?S_IRUSR)?str[1]?=?'r';
?94???if(mode?&?S_IWUSR)?str[2]?=?'w';
?95???if(mode?&?S_IXUSR)?str[3]?=?'x';
?96???
?97???if(mode?&?S_IRGRP)?str[4]?=?'r';
?98???if(mode?&?S_IWGRP)?str[5]?=?'w';
?99???if(mode?&?S_IXGRP)?str[6]?=?'x';
100???
101???if(mode?&?S_IROTH)?str[7]?=?'r';
102???if(mode?&?S_IWOTH)?str[8]?=?'w';
103???if(mode?&?S_IXOTH)?str[9]?=?'x';??
104?}
105?
106?#include?<pwd.h>
107?
108?char?*uid_to_name(uid_t?uid)
109?/*
110??*?returns?pointer?to?username?associated?with?uid,?uses?getpw()
111??*/
112?{
113???struct?passwd??*pw_ptr;
114???static?char?numstr[10];
115???
116???if(?(pw_ptr?=?getpwuid(uid))?==?NULL)
117???{
118?????printf(numstr,?"%d",?uid);
119?????return?numstr;
120???}
121???else
122?????return?pw_ptr->pw_name;
123?}
124?
125?#include?<grp.h>
126?
127?char?*gid_to_name(gid_t?gid)
128?{
129???struct?group?*grp_ptr;
130???static?char?numstr[10];
131???
132???if?((grp_ptr?=?getgrgid(gid))?==?NULL)
133???{
134?????sprintf(numstr,?"%d",?gid);
135?????return?numstr;
136???}
137???else
138?????return?grp_ptr->gr_name;
139?}
140???
141?
爭取早日將其他功能實現。