文章目录
一、请使用目录相关函数以及文件属性相关函数实现:显示指定路径下所有文件属性的功能(除了隐藏文件)。类似 ls -l 一个目录
1. 获取文件属性相关函数
①权限由八进制转为rwx
//权限转换
void get_permission(mode_t a)
{
for(int i=8;i>=0;i--)
{
if((a&(1<<i))==0)
{
printf("-");
}
else
{
if(i%3==2)
{
printf("r");
}
if(i%3==1)
{
printf("w");
}
if(i%3==0)
{
printf("x");
}
}
}
//printf("\n");
}
②文件类型
//获取文件类型
void get_type(mode_t a)
{
switch (a & 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;
}
}
③通过uid和gid获取当前用户和组用户
//获取当前用户
int get_usrname(uid_t uid)
{
struct passwd* pwd = getpwuid(uid);
if(NULL == pwd)
{
printf("getpwuid failed\n");
return -1;
}
printf(" %s",pwd->pw_name);
return 0;
}
//获取组用户
int get_grpname(gid_t gid)
{
struct group* grp = getgrgid(gid);
if(NULL == grp)
{
printf("getgrpid failed\n");
return -1;
}
printf(" %s",grp->gr_name);
return 0;
}
④将时间从秒数转换为标准格式
//时间格式转换
void get_time(__time_t sec)
{
struct tm* time = localtime(&sec);
printf(" %02d月 %02d %02d:%02d", time->tm_mon+1,time->tm_mday,time->tm_hour,time->tm_min);
}
2.读取目录中的文件名和测试函数
char* pathname要路径+文件名
int main(int argc, const char *argv[])
{
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)
{
//printf("目录读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}else if(rp->d_name[0]!='.')
{
//printf("%s\n",rp->d_name);
struct stat buf;
char arr[300] = "";
strcpy(arr,argv[1]);
strcat(arr,rp->d_name);
if(stat(arr,&buf)<0)
{
perror("stat");
return -1;
}
//文件类型
get_type(buf.st_mode);
//权限转换
get_permission(buf.st_mode);
//硬链接文件数
printf(" %ld", buf.st_nlink );
//获取当前用户名
get_usrname(buf.st_uid);
//printf( "uid:%d\n" , buf.st_uid);
//获取组用户名
get_grpname(buf.st_gid);
//printf( "gid:%d\n" , buf.st_gid);
//文件大小
printf( " %6ld" , buf.st_size);
//获取创建时间 时间格式转换
get_time(buf.st_ctime);
printf(" %s\n",rp->d_name);
}
}
closedir(dp);
return 0;
}