创作本文目的:记录自己的学习历程
任务
要求
使用目录相关函数以及文件属性相关函数实现:显示指定路径下所有文件属性的功能(除了隐藏文件)。
类似 ls -l 一个目录
代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
#include <errno.h>
//获取文件类型
int get_fileType(mode_t m,char *per)
{
switch(m & S_IFMT)
{
case S_IFBLK: per[0]='b';break;
case S_IFCHR: per[0]='c';break;
case S_IFDIR: per[0]='d';break;
case S_IFIFO: per[0]='p';break;
case S_IFLNK: per[0]='l';break;
case S_IFREG: per[0]='-';break;
case S_IFSOCK:per[0]='s';break;
default: printf("unknown?\n");
}
return 0;
}
//获取文件权限
int get_permission(mode_t m,char *per)
{
int j=1;
for(int i=8;i>=0;i--)
{
if(m&(1<<i))
{
if((i+1)%3==0)
per[j++]='r';
else if((i+1)%3==1)
per[j++]='x';
else if((i+1)%3==2)
per[j++]='w';
}
else
per[j++]='-';
}
return 0;
}
//获取文件所属用户名
void get_usrname(uid_t uid)
{
struct passwd *usr=getpwuid(uid);
if(NULL == usr)
{
printf("getpwuid failed\n");
return;
}
printf(" %s",usr->pw_name);
}
//获取文件所属组用户名
void get_grpname(gid_t gid)
{
struct group *grp=getgrgid(gid);
if(NULL == grp)
{
printf("getgrgid failed\n");
return;
}
printf(" %s",grp->gr_name);
}
//获取文件创建时间
void get_time(__time_t t)
{
struct tm *info = localtime(&t);
printf(" %d月 %02d %02d:%02d",\
info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min);
}
int checkAllStat(DIR *dp,const char *argv)
{
struct dirent *rp = NULL;
while(1)
{
rp = readdir(dp);
if(NULL==rp)
{
if(0 == errno) //没更新错误码,目录被读取到结尾
{
printf("目录读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
if(*(rp->d_name)=='.')
continue;
//获取文件属性
struct stat buf;
char s[256]="";
strcpy(s,argv);
strcat(s,rp->d_name);
if(stat(s,&buf)<0)
{
perror("stat");
return -1;
}
//文件类型以及权限
char per[11];
bzero(per,sizeof(per));
get_fileType(buf.st_mode,per);
get_permission(buf.st_mode,per);
printf("%s",per);
//硬链接数
printf(" %3ld",buf.st_nlink);
//文件所属用户
get_usrname(buf.st_uid);
//文件所属组用户
get_grpname(buf.st_gid);
//文件大小
printf(" %9ld",buf.st_size);
//文件创建日期
get_time(buf.st_ctime);
//文件名
printf(" %s\n",rp->d_name);
}
return 0;
}
int main(int argc, const char *argv[])
{
DIR *dp = opendir(argv[1]);
if(NULL==dp)
{
perror("opendir");
return -1;
}
checkAllStat(dp,argv[1]);
closedir(dp);
return 0;
}