利用opendir打开一个目录,打印出该目录下除隐藏文件以外的文件信息,类似(ls-l)的效果。
//输入一个外部目录路径,要求显示该路径下,所有文件的详细信息,除了隐藏文件
#include "head.h"
//判断文件的类别
char get_filemix(mode_t mode)
{
switch(mode & S_IFMT)
{
case S_IFSOCK: return 's';
case S_IFLNK: return 'l';
case S_IFREG: return '-';
case S_IFBLK: return 'b';
case S_IFDIR: return 'd';
case S_IFCHR: return 'c';
case S_IFIFO: return 'p';
}
return 'T';
}
//判断文件的执行权限
void get_filePermission(mode_t mode)
{
char arr[]="rwx";
for(int i=0;i<9;i++)
{
if(mode&(0400>>i)==0)
{
printf("%c",'-');
}
else
{
printf("%c",arr[i%3]);
}
}
printf("\t");
}
//计算文件用户
void file_uid(uid_t uid)
{
struct passwd *ugd=getpwuid(uid);
printf("%s\t",ugd->pw_name);
return;
}
//计算文件的组用户
void file_gid(gid_t gid)
{
struct group *ggd=getgrgid(gid);
printf("%s\t",ggd->gr_name);
return;
}
//计算文件的日期
void get_month(int tm_mon,char mon[])
{
switch(tm_mon)
{
case 0:
strcpy(mon,"一月");
break;
case 1:
strcpy(mon,"二月");
break;
case 2:
strcpy(mon,"三月");
break;
case 3:
strcpy(mon,"四月");
break;
case 4:
strcpy(mon,"五月");
break;
case 5:
strcpy(mon,"六月");
break;
case 6:
strcpy(mon,"七月");
break;
case 7:
strcpy(mon,"八月");
break;
case 8:
strcpy(mon,"九月");
break;
case 9:
strcpy(mon,"十月");
break;
case 10:
strcpy(mon,"十一月");
break;
case 11:
strcpy(mon,"十二月");
break;
}
}
//主函数
int main(int argc, const char *argv[])
{
if(argc<2)
{
// printf("请输入目录路径\n");
return -1;
}
printf("请输入目录路径: ");
DIR *Pa=opendir(argv[1]);
if(NULL==Pa)
{
ERR_MSG("open");
return -1;
}
struct dirent *Pb=NULL;
int i=0;
while(1)
{
Pb=readdir(Pa);//结构体 d_name存放文件的文件名
if(Pb==NULL)//分为两种情况
{
if(errno==0)//文件读取完毕,不更新的errno为0
{
printf("文件读取完毕\n");
break;//终止循环,不终止函数
}
else
{
ERR_MSG("readdir");
return -1;//函数或文件出错,终止函数
}
}
//打印文件中的详细信息
struct stat buf;
char name[32]="";
strcpy(name,Pb->d_name);
if(stat(name,&buf)<0)//第一个参数直接填字符串时不需要加上""
{
ERR_MSG("stat");
return -1;
}
//判断文件的类别
get_filemix(buf.st_mode);
printf("%c",get_filemix(buf.st_mode));
//输出文件中的执行权限
get_filePermission(buf.st_mode);
//硬链接数
printf("%lu\t",buf.st_nlink);
//计算文件的用户
// char arr_uid[32]="";
file_uid(buf.st_uid);
//计算文件的组用户
// char arr_gid[32]="";
file_gid(buf.st_gid);
//文件的大小
printf("%ld\t",buf.st_size);
//计算文件的日期
struct tm *Pc=localtime(&buf.st_ctime);
char mon[32]="";
get_month(Pc->tm_mon,mon);
fprintf(stdout,"%s %02d;%02d;%02d\n",mon,Pc->tm_mday,Pc->tm_hour,Pc->tm_min);
}
if(closedir(Pa)<0)
{
ERR_MSG("closedir");
return -1;
}
return 0;
}