ls"/>
2022/7/29——手动实现ls
众所周知,ls-l可以显示除了隐藏文件之外的所有的文件的详细信息,例:
-rwxrwxr-x 1 ubuntu ubuntu 13184 7月 29 19:10 a.out
利用已有的系统函数将获取到的信息转换成特定的格式并打印到终端上
1.获取文件类型
int get_fileType(mode_t m)
{switch (m & S_IFMT) {case S_IFBLK: printf("b"); break;case S_IFCHR: printf("c"); break;case S_IFDIR: printf("d"); break;case S_IFIFO: printf("p"); break;case S_IFLNK: printf("l"); break;case S_IFREG: printf("-"); break;case S_IFSOCK: printf("s"); break;default: printf("unknown?\n"); break;}return 0;
}
2、获取文件权限
利用按位与的方式依次取出mode_t的低九位的值并返回对应的权限
void get_mode(mode_t a)
{char str[9]={'r','w','x','r','w','x','r','w','x'};for(int i=8; i>=0 ; i--){if((a & (1<<i)) !=0){printf("%c",str[8-i]);}else{printf("-");}}
}
3、根据uid获取所属人
int get_usrname(uid_t uid)
{struct passwd* pwd =getpwuid(uid);if(NULL==pwd){printf("getpwuid failed");return -1;}printf(" %s",pwd->pw_name);return 0;
}
4、根据gid获取所属组
int get_grpname(gid_t gid)
{struct group* grp =getgrgid(gid);if(NULL==grp){printf("getgrgid failed\n");return -1;}printf(" %s",grp->gr_name);return 0;
}
5、根据获得的秒数打印出文件创建时间
void get_time(long ctime)
{struct tm* info=localtime(&ctime);printf(" %d-%02d-%02d %02d:%02d:%02d",\info->tm_year+1900,info->tm_mon+1,info->tm_mday,\info->tm_hour,info->tm_min,info->tm_sec);
}
主函数
读取外部传参,使用opendir打开对应路径,并读取该路径下除了隐藏文件外所有文件的信息
注意点:readdir函数只能读取到文件的信息(不包含路径),而stat函数需要文件的完整路径才能正确的找到对应的文件
int main(int argc, const char *argv[])
{//判断传参是否合法if(argc<2){printf("请输入路径");return -1;}DIR* dp = opendir(argv[1]); //打开指定路径下的目录 if(NULL==dp){perror("opendir");return -1;}struct dirent* rp =NULL; //存放文件信息while(1){rp=readdir(dp); //依次读取指定路径下的文件信息if(NULL==rp){if(0==errno){break;}else{perror("readdir");return -1;}}char file[99]; //存放文件路径完整路径struct stat buf; if(rp->d_name[0]!='.'){strcpy(file,argv[1]); //将路径存入数组中if(file[strlen(file)-1]!='/') //判断路径是否合法{printf("所给路径非法,需要以'/'结尾\n");exit(0);}strcat(file,rp->d_name); //将文件名存入if(stat(file,&buf)<0){perror("stat");return -1;}//文件类型和权限get_fileType(buf.st_mode);get_mode(buf.st_mode);//硬链接数printf(" %ld",buf.st_nlink);//文件所属用户get_usrname(buf.st_uid);//文件所属组get_grpname(buf.st_gid);//文件大小printf(" %ld",buf.st_size);//文件创建日期get_time(buf.st_mtime);//打印文件名printf(" %s\n",rp->d_name);}}//关闭目录closedir(dp);return 0;
}
更多推荐
2022/7/29——手动实现ls
发布评论