1、使用IO函数实现“ls -l 路径”的效果
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
int get_file(char *fname,DIR *dp);
int get_char_mode(mode_t mode);
int get_usrname(uid_t uid);
int get_grpname(gid_t gid);
int get_time(time_t sec);
void ls_only_file(struct stat buf,const char *fname);
int main(int argc, const char *argv[])
{
if(argc<2){
fputs("传参不足\n",stderr);
return -1;
}
char fname[256];
char pathname[256];
int res;
struct stat buf;
DIR *dp=opendir(argv[1]);
if(NULL==dp){
perror("opendir");
return -1;
}
while(1){
bzero(fname,sizeof(fname));
bzero(pathname,sizeof(pathname));
res=get_file(fname,dp);
strcpy(pathname,argv[1]);
strcat(pathname,fname);
if(-1==res){
fputs("读取有误\n",stderr);
closedir(dp);
return -1;
}else if(1==res){
fputs("目录读取完毕\n",stdout);
break;
}else if(2==res){
if(stat(pathname,&buf)<0){
fputs("stat failed\n",stderr);
closedir(dp);
return -1;
}
ls_only_file(buf,fname);
}
}
closedir(dp);
return 0;
}
int get_file(char *fname,DIR *dp)
{
int i;
struct dirent *rp=NULL;
rp=readdir(dp);
if(NULL==rp){
if(errno==0){
return 1;
}else{
perror("readdir");
return -1;
}
}
if(rp->d_name[0]!='.'){
for(i=0;i<strlen(rp->d_name);i++){
fname[i]=rp->d_name[i];
}
fname[i]=0;
return 2;
}
return 0;
}
int get_char_mode(mode_t mode)
{
switch (mode & 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?"); break;
}
for(int i=8;i>=0;i--){
if((mode&(1<<i))!=0){
if(i%3==2){
printf("r");
}else if(i%3==1){
printf("w");
}else{
printf("x");
}
}else{
printf("-");
}
}
return 0;
}
int get_usrname(uid_t uid)
{
struct passwd *pd=getpwuid(uid);
if(NULL==pd){
return -1;
}
printf(" %s",pd->pw_name);
return 0;
}
int get_grpname(gid_t gid)
{
struct group *gp=getgrgid(gid);
if(NULL==gp){
return -1;
}
printf(" %s",gp->gr_name);
return 0;
}
int get_time(time_t sec)
{
struct tm *info=localtime(&sec);
if(NULL==info){
return -1;
}
printf(" %d月 %d %02d:%02d",info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min);
return 0;
}
void ls_only_file(struct stat buf,const char *fname)
{
get_char_mode(buf.st_mode);
printf(" %ld",buf.st_nlink);
get_usrname(buf.st_uid);
get_grpname(buf.st_gid);
printf(" %5ld",buf.st_size);
get_time(buf.st_ctime);
printf(" %s\n",fname);
}
测试: