#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<head.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#include<sys/types.h>
#include<dirent.h>
#include<errno.h>
int mulu(char p[1000])
{
DIR *dp=opendir(p);
if(NULL==dp)
{
perror("opendir");
return -1;
}
printf("打开成功");
while(1)
{
struct dirent *rp=readdir(dp);
if(rp==NULL)
{
if(0==errno)
{
printf("目录读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
wenjian(rp->d_name);
}
if(closedir(dp)<0)
{
perror("closedir");
return -1;
}
return -1;
}
int wenjian(char p[1000])
{
struct stat fl;
if(stat(p,&fl))
{
perror("stat");
return -1;
}
//文件的类型和权限
printf("mode:0%o\n",fl.st_mode);
int i=0400;
int j=0;
mode_t m=fl.st_mode;
while(j<3)
{
if((m&i)!=0)
putchar('r');
else
putchar('-');
if((m&i>>1)!=0)
putchar('w');
else
putchar('-');
if((m&i>>2)!=0)
putchar('x');
else
putchar('-');
i=i>>3;
j++;
}
if( S_ISREG(m))
{
putchar('-');
}
else if( S_ISDIR(m))
{
putchar('d');
}
else if(S_ISCHR(m))
{
putchar('c');
}
else if(S_ISBLK(m))
{
putchar('b');
}
else if( S_ISFIFO(m))
{
putchar('p');
}
else if(S_ISLNK(m))
{
putchar('l');
}
else if(S_ISSOCK(m))
{
putchar('s');
}
printf("link:%ld\n",fl.st_nlink);
printf("uid:%d\n",fl.st_uid);
struct passwd* pwd=getpwuid(fl.st_uid);
if(NULL==pwd)
{
perror("getpwuid");
return -1;
}
printf("%s\n",pwd->pw_name);
printf("gid:%d\n",fl.st_gid);
//将gid换成名字
struct group* grp=getgrgid(fl.st_gid);
if(NULL==grp)
{
perror("getgrgid");
return -1;
}
printf("%s\n",grp->gr_name);
//文件大小
printf("size:%ld\n",fl.st_size);
//文件时间
struct tm* t1=NULL;
t1=localtime(&fl.st_ctime);
printf("年:%ld月:%d 日:%d 时:%d 分:%d 秒:%d",t1->tm_year+1900,t1->tm_mon+1,t1->tm_mday,t1->tm_hour,t1->tm_min,t1->tm_sec);
}
int main(int argc, const char *argv[])
{
char a[200];
printf("输入文件名\n");
scanf("%s",a);
//判断是目录还是文件
struct stat fl;
if(stat(a,&fl))
{
perror("stat");
return -1;
}
if(S_ISDIR(fl.st_mode))
{
printf("是目录\n");
mulu(a);
}
else
{
printf("是文件\n");
wenjian(a);
}
return 0;
}