请使用目录相关函数以及文件属性相关函数实现:显示指定路径下所有文件属性的功能(除了隐藏 文件)。 类似 ls -l 一个目录
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<time.h>
#include<grp.h>
#include<stdlib.h>
#include<dirent.h>
#include<errno.h>
#include<string.h>
void p_st_mode(mode_t mode)
{
for(int i=8;i>=0;i--)
{
if((mode & (1<<i))==0)
{
printf("-");
continue;
}else
{
int flag=i%3;
if(flag==2)
{
printf("%c",'r');
}
else if(flag==1)
{
printf("%c",'w');
}
else if(flag==0)
{
printf("%c",'x');
}
}
}
}
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;
}
}
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);
}
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 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);
char s[20]="";
char ss[20]="";
strcpy(s,argv[1]);
if(NULL==rp)
{
if(0==errno)
{
break;
}
else
{
perror("readdir");
return -1;
}
}
if(rp->d_name[0]=='.')
{
continue;
}
strcpy(ss,rp->d_name);
strcat(s,ss);
struct stat buf;
if(stat(s,&buf)<0)
{
perror("stat");
return -1;
}
get_filetype(buf.st_mode);
p_st_mode(buf.st_mode);
printf(" %ld",buf.st_nlink);
get_usrname(buf.st_uid);
get_grpname(buf.st_gid);
printf(" %6ld",buf.st_size);
time_t t=buf.st_ctime;
struct tm* info = localtime(&t);
printf(" %02d %02d %02d:%02d ",\
info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min);
printf("%s",rp->d_name);
printf("\n");
}
closedir(dp);
return 0;
}