代码:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
//构造文件权限转化字符形式函数
void change_mod(mode_t m)
{
//创建一个储存'r''w''x'的数组用来提取'r''w''x'
char arr[]="rwx";
//循环对比权限的八进制数和rwx
for(int i=0;i<9;i++)
{
if((m&(0400>>i))==0)
{
putchar('-');
}
else
{
fprintf(stdout,"%c",arr[i%3]);
}
}
printf(" ");
}
//构造文件类型转为字符函数
void change_type(mode_t n)
{
switch(S_IFMT&n)
{
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;
default: printf("mode错误\n");
}
}
//封装uid转字符类型函数
void change_uid(uid_t a)
{
struct passwd* b=getpwuid(a);
printf(" %s ",b->pw_name);
}
//封装gid转字符类型函数
void change_gid(uid_t a)
{
struct group* b=getgrgid(a);
printf("%s ",b->gr_name);
}
//封装时间转日历格式函数
void time_size(time_t a)
{
struct tm* b=localtime(&a);
//定义一个中文月份的数组
char *arr[13]={0,0,0};
arr[0]="一月";
arr[1]="二月";
arr[2]="三月";
arr[3]="四月";
arr[4]="五月";
arr[5]="六月";
arr[6]="七月";
arr[7]="八月";
arr[8]="九月";
arr[9]="十月";
arr[10]="十一";
arr[11]="十二";
fprintf(stdout,"%s %d %02d:%02d ",arr[b->tm_mon],b->tm_mday,b->tm_hour,b->tm_min);
}
int main(int argc, const char *argv[])
{
if(argc < 2)
{
fprintf(stderr, "请在命令行输入目录名\n");
return -1;
}
//打开一个目录
DIR* dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
struct dirent* rp = NULL;
int i = 1;
while(1)
{
rp = readdir(dp);
if(NULL == rp)
{
if(0 == errno) //没有更新errno
{
break;
}
else //更新errno
{
perror("readdir");
return -1;
}
}
//判断获取到的文件名是否以'.'开头
if('.' != rp->d_name[0]) //*rp->d_name
{
struct stat buf; //设置stat结构体类型的变量
//提取文件所有属性
stat(rp->d_name,&buf); //通过变量取地址来存储文件属性
//文件类型
change_type(buf.st_mode);
//文件权限
change_mod(buf.st_mode);
//通过结构体变量访问硬连接数
printf("%ld ",buf.st_nlink);
//uid
change_uid(buf.st_uid);
//gid
change_gid(buf.st_gid);
//文件大小
printf("%02ld ",buf.st_size);
//日期
time_size(buf.st_atime);
//目录名
printf("%s\n", rp->d_name);
}
}
if(closedir(dp) < 0)
{
perror("closedir");
return -1;
}
return 0;
}
效果:
