将指定目录下所有文件的属性显示出来,类似 ls -l 一个指定目录
提示:
打开目录,
读取目录中的文件名
将路径和文件名拼接
传入给stat获取文件属性
#include <head.h>
void get_fileLimit(mode_t mode)
{
char arr[]="rwx";
for(int i=0;i<9;i++)
{
if((mode&(0400>>i))==0)
{
putchar('-');
continue;
}
putchar(arr[i%3]);
}
}//提取文件权限
void get_fileType(mode_t typ)
{
switch(typ&S_IFMT)
{
case S_IFREG: putchar('-'); break;
case S_IFDIR: putchar('f'); break;
case S_IFCHR: putchar('c'); break;
case S_IFBLK: putchar('b'); break;
case S_IFIFO: putchar('p'); break;
case S_IFLNK: putchar('l'); break;
case S_IFSOCK: putchar('s'); break;
}
}//提取文件类型
int main(int argc, const char *argv[])
{
if(argc<2)
{
puts("请输入文件名:");
return -1;
}
DIR* op=opendir(argv[1]);
if(NULL==op)
{
ERR_MSG("opendir");
return -1;
}
while(1)
{
struct dirent*re=readdir(op);
if(re==NULL)
{
if(0==errno)
{
printf("目录读取完毕\n");
break;
}
else
{
ERR_MSG("readdir");
return -1;
}
}
if(re->d_name[0]!='.')
{
char brr[20]="";
char crr[5]="/";
strcpy(brr,argv[1]);
strcat(brr,crr);
strcat(brr,re->d_name);
struct stat buf;
int ret=stat(brr,&buf);
if(ret==-1)
{
ERR_MSG("stat");
return -1;
}
// printf("%o\n",buf.st_mode);
get_fileLimit(buf.st_mode);
get_fileType(buf.st_mode);
printf("%d ",buf.st_uid);
struct passwd* u_id=getpwuid(buf.st_uid);
if(NULL==u_id)
{
ERR_MSG("getpwuid");
return -1;
}
printf("%s ",u_id->pw_name);
printf("%d ",buf.st_gid);
struct group* g_id=getgrgid(buf.st_gid);
if(NULL==g_id)
{
ERR_MSG("getpwuid");
return -1;
}
printf("%s ",g_id->gr_name);
printf("%lu ",buf.st_nlink);
printf("%ld ",buf.st_size);
// printf("%ld\n",buf.st_atime);
time_t on=buf.st_atime;
struct tm* in=localtime(&on);
printf("%d-%02d-%02d %02d:%02d:%02d ",in->tm_year+1900,in->tm_mon+1,in->tm_mday,in->tm_hour,in->tm_min,in->tm_sec);
printf("%s\n",re->d_name);
}
}
closedir(op);
return 0;
}