main.c文件
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<pwd.h>
#include<string.h>
#include<time.h>
#include<dirent.h>
#include<errno.h>
#include"a.h"
int main(int argc,const char *argv[])
{
DIR *dp=opendir(argv[1]);
if(NULL==dp)
{
perror("opendir");
return -1;
}
struct dirent *rp=NULL;
while(1)
{
rp=readdir(dp);
if(NULL==rp)
{
if(0==errno)
{
printf("dir reading success!\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
if(*rp->d_name=='.')
{
continue;
}
struct stat buf;
char a[50]; //创建一个字符串数组
bzero(a,sizeof(a));
strcpy(a,argv[1]); //将argv[1]的路径复制字符串数组a
int i=strlen(a); //i去字符串数组的长度
strcat(a,rp->d_name);
if(a[i-1]!='/') //判断最后一位是不是‘/’,是就跳过,不是就在后
{ //面添加‘/’,例如你的argv[1]是../,就不需要
a[i]='/'; //添加/,如果是../day2,寻找day2中的文件就
} //需要添加‘/’
strcat(a,rp->d_name); //将argv[1]和目录中文件名字结合形成文件的绝对路径
if(stat(a,&buf)<0)
{
perror("stat");
return -1;
}
get_filetype(buf.st_mode);
get_mode(buf);
printf(" %ld\t",buf.st_nlink);
get_usrname(buf.st_uid);
get_grpname(buf.st_gid);
printf(" %ld\t",buf.st_size);
get_time(buf.st_mtime);
printf("%s\n",rp->d_name);
}
closedir(dp);
return 0;
}
.c文件
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include"a.h"
int get_mode(struct stat buf)
{
int i=0;
while(i<9)
{
if((buf.st_mode & 1<<(8-i))!=0)
{
if((i+1)%3==1)
{
printf("r");
}
else if((i+1)%3==2)
{
printf("w");
}
else
{
printf("x");
}
}
else
{
printf("-");
}
i++;
}
return 0;
}
int get_filetype(mode_t m)
{
switch(m & S_IFMT)
{
case S_IFBLK:printf("b");break;
case S_IFCHR:printf("c");break;
case S_IFDIR:printf("d");break;
case S_IFIFO:printf("p");break;
case S_IFLNK:printf("l");break;
case S_IFREG:printf("-");break;
case S_IFSOCK:printf("s");break;
default:printf("unknow!\n");break;
}
return 0;
}
int get_usrname(uid_t uid)
{
struct passwd* pwd=getpwuid(uid);
if(NULL==pwd)
{
printf("getpwuid failed!\n");
return -1;
}
printf("%s\t",pwd->pw_name);
return 0;
}
int get_grpname(gid_t gid)
{
struct group* grp=getgrgid(gid);
if(NULL==grp)
{
printf("getgrgid failed!\n");
return -1;
}
printf("%s\t",grp->gr_name);
return 0;
}
int get_time(time_t mtime)
{
struct tm* info=NULL;
info=localtime(&mtime);
printf("%d-%02d-%02d %02d:%02d:%02d\t",\
info->tm_year+1900,info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min,info->tm_sec);
}
抓函数测试结果
当前文件下
跨路径文件下
.h文件
#ifndef __A__
#define __A__
int get_mode(struct stat buf);
int get_filetype(mode_t m);
int get_usrname(uid_t uid);
int get_grpname(gid_t gid);
int get_time(time_t mtime);
#endif