将指定目录下所有文件的属性显示出来,类似 ls -l 一个指定目录
提示:
打开目录,
读取目录中的文件名
将路径和文件名拼接
传入给stat获取文件属性
#include"head.h"
//获取文件类型
int get_fileType(mode_t m)
{
switch(m & S_IFMT)
{
case S_IFREG: putchar('-'); break;
case S_IFSOCK: putchar('s'); break;
case S_IFLNK: putchar('l');break;
case S_IFBLK: putchar('b'); break;
case S_IFDIR: putchar('d'); break;
case S_IFCHR: putchar('c'); break;
case S_IFIFO: putchar('p'); break;
}
return 0;
}
//获取权限
int get_filePemission(mode_t mode)
{
int a=0400;
char per[]="rwx";
for(int i=0;i<9;i++,a=a>>1)
{
if((mode& a) == 0)
{
putchar('-');
continue;
}
else
{
putchar(per[i%3]);
}
}
putchar(10);
return 0;
}
int main(int argc, const char *argv[])
{
if(argc<2)
{
printf("please input great than one\n");
return -1;
}
char str[30]="";
DIR* dirp = opendir(argv[1]);//打开目录
if(NULL==dirp)
{
perror("open");
return -1;
}
//printf("opendir success\n");
struct dirent* rp=NULL;
while(1)
{
bzero(str,sizeof(str));
strcpy(str,argv[1]);
rp=readdir(dirp);
if(NULL==rp)
{
if(0==errno)
{
// printf("目录读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
//打印除了隐藏文件外的所有文件名
if(rp->d_name[0] !='.')
{
struct stat buf;
if(stat(strcat(str,rp->d_name),&buf)<0)
{
perror("stat");
return -1;
}
//修改时间
struct tm* info=localtime(&buf.st_ctime);
// printf("mode=0%o\n",buf.st_mode);
// printf("uid=%d\n",buf.st_uid);//uid
struct passwd* pwd=getpwuid(buf.st_uid);
if(NULL == pwd)
{
perror("getpwuid");
return -1;
}
//printf("gid=%d\n",buf.st_gid);//文件所属组用户,gid
struct group* grp =getgrgid(buf.st_gid);
if(NULL==grp)
{
perror("getgrgid");
return -1;
}
get_fileType(buf.st_mode);//文件类型
get_filePemission(buf.st_mode);//文件权限
printf("%ld ",buf.st_nlink);//硬链接个数
printf("%s ",pwd->pw_name);//用户名字
printf("%s ",grp->gr_name);//组用户名字
printf("%ld ",buf.st_size);
// printf("%ld ",buf.st_ctime);//时间
printf("%d %02d %02d %02d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);//时间
printf("%s\n",rp->d_name);//文件名字
}
}
closedir(dirp);//关闭目录
return 0;
}