#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<string.h>
#include<time.h>
#include<pwd.h>
#include<unistd.h>
#include<grp.h>
#include<dirent.h>
//struct tm *mytime=(struct tm*)malloc(sizeof(struct tm));
void Normal(DIR* dir,struct dirent* ptr, int cnt){
while((ptr=readdir(dir))!=NULL){
if(strcmp(ptr->d_name,".")==0||strcmp(ptr->d_name,"..")==0||ptr->d_name[0]=='.')continue;
cnt++;
printf("%s ",ptr->d_name);
if(cnt%10==0)printf("\n");
}
printf("\n");
}
void DetailF(struct stat buf, char a[]){
char res[12];
if(S_ISLNK(buf.st_mode))res[0]='l';
else if(S_ISREG(buf.st_mode))res[0]='-';
else if(S_ISDIR(buf.st_mode))res[0]='d';
else if(S_ISCHR(buf.st_mode))res[0]='c';
else if(S_ISBLK(buf.st_mode))res[0]='b';
else if(S_ISFIFO(buf.st_mode))res[0]='f';
else if(S_ISSOCK(buf.st_mode))res[0]='s';
if(buf.st_mode&S_IRUSR)res[1]='r';
else res[1]='-';
if(buf.st_mode&S_IWUSR)res[2]='w';
else res[2]='-';
if(buf.st_mode&S_IXUSR)res[3]='x';
else res[3]='-';
if(buf.st_mode&S_IRGRP)res[4]='r';
else res[4]='-';
if(buf.st_mode&S_IWGRP)res[5]='w';
else res[5]='-';
if(buf.st_mode&S_IXGRP)res[6]='x';
else res[6]='-';
if(buf.st_mode&S_IROTH)res[7]='r';
else res[7]='-';
if(buf.st_mode&S_IWOTH)res[8]='w';
else res[8]='-';
if(buf.st_mode&S_IXOTH)res[9]='x';
else res[9]='-';
res[10]='\0';
printf("%s", res);
printf(" %5ld",buf.st_nlink);
printf(" %s",getpwuid(buf.st_uid)->pw_name);
printf(" %s",getgrgid(buf.st_gid)->gr_name);
printf(" %5ld",buf.st_size);
char* time_st=ctime(&buf.st_mtime);
time_st[strcspn(time_st, "\n")]=0;
printf(" %s",time_st);
printf(" %s",a);
printf("\n");
}
void DetailD(DIR* dir, struct dirent* ptr, char d[]){
struct stat buf;
char a[1024];
while((ptr=readdir(dir))!=NULL){
if(strcmp(ptr->d_name,".")==0||strcmp(ptr->d_name,"..")==0||ptr->d_name[0]=='.')continue;
if(strcmp(d, "/")!=0)
sprintf(a, "%s%s%s", d,"/",ptr->d_name);
else sprintf(a, "%s%s", d, ptr->d_name);
stat(a, &buf);
DetailF(buf, ptr->d_name);
}
}
int main(int argc, char* argv[]){
DIR *dir;
struct dirent* ptr;
struct stat buf;
if(argc==1){
stat(".", &buf);
dir=opendir(".");
int cnt=0;
Normal(dir, ptr, cnt);
closedir(dir);
}
if(argc>=2&&strcmp(argv[1], "-l")!=0){
int cnt=0;
for(int i=1; i<argc; i++){
stat(argv[i], &buf);
if(!S_ISDIR(buf.st_mode)){
cnt++;
printf("%s ",argv[i]);
if(cnt%10==0)printf("\n");
}
else{
dir=opendir(argv[i]);
Normal(dir, ptr, cnt);
closedir(dir);
}
}
printf("\n");
}
if(argc>=2&&strcmp(argv[1], "-l")==0){
int cnt=0;
if(argc==2){
stat(".", &buf);
dir=opendir(".");
DetailD(dir, ptr, ".");
closedir(dir);
}
else{
for(int i=2; i<argc; i++){
stat(argv[i], &buf);
if(!S_ISDIR(buf.st_mode))
DetailF(buf,argv[i]);
else{
dir=opendir(argv[i]);
DetailD(dir, ptr,argv[i]);
closedir(dir);
}
}
}
}
return 0;
}
Linux下实现ls功能
最新推荐文章于 2024-07-08 22:09:55 发布