代码:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include <math.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <IOhead.h>
void getmission(mode_t m)
{
for(int i=9;i>=1;i--)
{ if(0 != (m & (int)pow(2,i-1)))
{
if(i%3==0)
putchar('r');
else if(i%3==2)
putchar('w');
else
putchar('x');
}
else
putchar('-');
}
return;
}
void getfiletype(mode_t m)
{
switch(m & 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;
}
return;
}
void output(struct stat buf)
{
getfiletype(buf.st_mode);
getmission(buf.st_mode);
printf(" %ld",buf.st_nlink);
struct passwd *pwd=getpwuid(buf.st_uid);
printf(" %s",pwd->pw_name);
struct group *grp = getgrgid(buf.st_gid);
printf(" %s",grp->gr_name);
printf(" %ld",buf.st_size);
struct tm *t=localtime(&buf.st_atime);
printf(" %d月 %d %d:%d",t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);
printf("\n");
}
int main(int argc, const char *argv[])
{
char str[128]="";
printf("请输入文件路径名:(如../day3 ./1.c)");
scanf("%s",str);
struct stat buf;
if(stat(str,&buf)<0)
{ ERR_MSG("stat");
return -1;
}
if(S_ISDIR(buf.st_mode))
{
DIR *dp=opendir(str);
if (NULL == dp)
{ ERR_MSG("opendir");
return -1;
}
while(1)
{
struct dirent *dr=readdir(dp);
if(NULL == dr)
{ if(0 == errno)
{ printf("文件读取完毕\n");
break;
}
else
{ ERR_MSG("readdir");
return -1;
}
}
struct stat nod;
char ss[128];
strcpy(ss,str);
strcat(ss,"/");
strcat(ss,dr->d_name);
int k=stat(ss,&nod);
if(k<0)
{ ERR_MSG("stat");
return -1;
}
output(nod);
}
}
else
output(buf);
return 0;
}
实验结果和代码:
思维导图: