#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
#include <time.h>
//文件权限
void get_filePermission(mode_t m)
{
char str[4]="rwx";
int i=0;
for(i=0;i<9;i++)
{
if((m&(0400>>i))==0)
{
putchar('-');
continue;
}
printf("%c",str[i%3]);
}
// puts("");
}
//文件类型
char get_filetype(mode_t m)
{
switch (m&S_IFMT)
{
case S_IFBLK: return ('b'); break;
case S_IFLNK: return ('l'); break;
case S_IFREG: return ('-'); break;
case S_IFSOCK: return ('s'); break;
case S_IFDIR: return ('d'); break;
case S_IFCHR: return ('c'); break;
case S_IFIFO: return ('p'); break;
default:return 0;
}
}
//文件所属用户
char* get_pwdname(uid_t uid,char *ptr)
{
struct passwd* pwd=getpwuid(uid);
if(NULL==pwd)
{
perror("getpwuid");
return NULL;
}
strcpy(ptr,pwd->pw_name);
return ptr;
}
//文件所属组用户
char* get_grname(gid_t gid,char *ptr)
{
struct group* grp=getgrgid(gid);
if(NULL==grp)
{
perror("gergrgid");
return NULL;
}
strcpy(ptr,grp->gr_name);
return ptr;
}
int main(int argc, const char *argv[])
{
struct stat buf;
char a;
char pwd[20]="";
char grp[20]="";
if(argc<2)
{
fprintf(stderr,"请在命令行输入文件名\n");
return -1;
}
DIR *dir=opendir(argv[1]);
if(NULL==dir)
{
perror("opendir");
return -1;
}
//int i=0;
struct dirent *read=NULL;
while(1)
{
read=readdir(dir);
if(NULL==read)
{
if(0==errno)
{
printf("目录读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
if(read->d_name[0]!='.')
//printf("%d %s\n",++i,read->d_name);
{
char lrr[64]="";
strcpy(lrr,argv[1]);
char b[30];
strcpy(b,read->d_name);
strcat(lrr,b);
if(stat(lrr,&buf)<0)
{
perror("stat");
return -1;
}
//文件的类型以及权限
//printf("st_mode:%o\n",buf.st_mode);
a=get_filetype(buf.st_mode);
printf("%c",a);
get_filePermission(buf.st_mode);
//硬链接个数
printf(" %ld ",buf.st_nlink);
//文件所属用户
get_pwdname(buf.st_uid,pwd);
printf("%s ",pwd);
//puts(pwd);
//printf("st_uid:%d\n",buf.st_uid);
//文件所属组用户
get_grname(buf.st_uid,grp);
printf("%s ",grp);
//puts( grp);
//printf("st_gid:%d\n",buf.st_gid);
//文件大小
printf("%ld ",buf.st_size);
//时间
//printf("st_ctime:%ld\n",buf.st_ctime);
struct tm *info=NULL;
info=localtime(&buf.st_ctime);
printf("%02d-%02d %02d:%02d ",\
info->tm_mon+1,\
info->tm_mday,info->tm_hour,info->tm_min);
//文件名
printf("%s\n",read->d_name);
}
}
closedir(dir);
return 0;
}
输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
最新推荐文章于 2024-03-21 13:14:32 发布