//fun.h
#ifndef __FUN_H__
#define __FUN_H__
int get_mode(mode_t mode);
int get_usrName(uid_t uid);
int get_usrGroup(gid_t gid);
int get_size(char *pathname);
int get_lastTime(time_t time);
#endif
// fun.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include"fun.h"
int get_mode(mode_t mode)
{
char str[11] = "-";
int flag = 0;
for(int i = 0;i <= 8;i++)
{
flag++;
if( mode & (0400 >> i) )
{
switch(flag%3)
{
case 1: str[flag] = 'r';break;
case 2: str[flag] = 'w';break;
case 0: str[flag] = 'x';break;
default: printf("mode erro\n");
return -1;
}
}
else
{
str[flag] = '-';
}
}
str[++flag] = '\0';
printf("%s",str);
return 0;
}
int get_usrName(uid_t uid)
{
struct passwd *usr = getpwuid(uid);
if(NULL == usr)
{
perror("get_usrName");
return -1;
}
printf("%s",usr->pw_name);
return 0;
}
int get_usrGroup(gid_t gid)
{
struct group *usr = getgrgid(gid);
if(NULL == usr)
{
perror("get_usrGroup");
return -1;
}
printf("%s",usr->gr_name);
return 0;
}
int get_size(char *pathname)
{
FILE *fp = fopen(pathname,"r");
if(NULL == fp)
{
printf("fopen get_size erro");
return -1;
}
fseek(fp,0,SEEK_END);
printf("%ld",ftell(fp));
if(EOF == fclose(fp))
{
perror("fclose get_size erro");
return -1;
}
return 0;
}
int get_lastTime(time_t time)
{
struct tm *last = localtime(&time);
if(NULL == last)
{
perror("get_lastTime");
return -1;
}
printf("%02d月 %2d %02d:%02d"\
,last->tm_mon+1 \
,last->tm_mday \
,last->tm_hour \
,last->tm_min \
);
return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <dirent.h>
#include "fun.h"
int main(int argc,const char *argv[])
{
struct stat buff;
char path[50];
DIR *dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
char *name = NULL;
struct dirent * dirp = NULL;
while(dirp = readdir(dp))
{
name = dirp->d_name;
if('.' == *name)
{
continue;
}
bzero(path,sizeof(path));
strcpy(path,argv[1]);
strcat(path,"/");
strcat(path,name);
// puts(path);
// puts(path);
stat(path,&buff);
get_mode(buff.st_mode);
putchar(' ');
printf("%ld",buff.st_nlink);
putchar(' ');
get_usrName(buff.st_uid);
putchar(' ');
get_usrGroup(buff.st_gid);
putchar(' ');
get_size(path);
putchar(' ');
get_lastTime(buff.st_ctime);
putchar(' ');
puts(name);
}
if(-1 == closedir(dp))
{
perror("closedir");
return -1;
}
return 0;
}