将指定目录下所有文件的属性显示出来,类似 ls -l 一个指定目录
提示:
打开目录,
读取目录中的文件名
将路径和文件名拼接
传入给stat获取文件属性
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
#include <dirent.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
int mode_1(mode_t mode)
{
switch(mode & S_IFMT)
{
case S_IFSOCK: putchar('s'); break;
case S_IFLNK: putchar('l'); break;
case S_IFREG: putchar('-'); 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;
}
printf(" ");
}
int mode_2(mode_t mode)
{
char arr[]="rwx";
for(int i = 0 ; i < 9 ; i++)
{
if( ((0400>>i) & mode ) == 0)
{
putchar('-');
continue;
}
putchar(arr[i%3]);
}
printf(" ");
return 0;
}
int main(int argc, const char *argv[])
{
DIR* dirp = opendir("./");
if(NULL == dirp)
{
perror("opendir");
return -1;
}
printf("opendir success\n");
struct dirent* rp =NULL;
while(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(rp->d_name,&buf) <0 )
{
ERR_MSG("stat");
return -1;
}
mode_1(buf.st_mode);
mode_2(buf.st_mode);
struct passwd* pwd = getpwuid(buf.st_uid);
if(NULL == pwd)
{
perror("getpwuidid");
return -1;
}
printf("%s ",pwd->pw_name);
struct group* grp = getgrgid(buf.st_gid);
if(NULL == grp)
{
perror("getgrgid");
return -1;
}
printf("%s ",grp->gr_name);
printf("%8ld ",buf.st_size);
time_t t = buf.st_mtime;
struct tm* info = localtime(&t);
printf("%d-%d-%d %d:%02d:%02d ",\
info->tm_year+1900,info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min,info->tm_sec);
printf("%s\n",rp->d_name);
}
}
closedir(dirp);
return 0;
}
运行结果: