头文件 std2.h
#ifndef __STD2_H__
#define __STD2_H__
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
char * permisson(mode_t m ,char prr[],int j );
char type(mode_t m);
char *uid(uid_t uid,char *brr);
char *gid(gid_t gid,char *crr);
struct tm * nowtime(time_t time);
int stdprint(char * name);
#endif
打印改目录下单个文件信息的函数
#include "std2.h"
//文件权限
char * permisson(mode_t m ,char prr[],int j )
{
int i=0;
char arr[4]="rwx";
// bzero(prr,j);
for(i=0;i<9;i++)
{
if((m&(0400>>i)) == 0 )
{
prr[i]='-';
continue;
}
prr[i]=arr[i%3];
}
return prr;
}
//文件类型
char type(mode_t m)
{
switch(m&S_IFMT)
{
case S_IFSOCK:
return('s');
case S_IFLNK:
return('l');
case S_IFREG:
return('-');
case S_IFBLK:
return('b');
case S_IFDIR:
return('d');
case S_IFCHR:
return('c');
case S_IFIFO:
return('p');
}
}
//Uid
char *uid(uid_t uid,char *brr)
{
struct passwd *uname=getpwuid(uid);
if(uname==NULL)
{
perror("getpwuid");
return NULL;
}
strcpy(brr,uname->pw_name);
return brr;
}
//gid
char *gid(gid_t gid,char *crr)
{
struct group *gname=getgrgid(gid);
if(gname==NULL)
{
perror("getgrgid");
return NULL;
}
strcpy(crr,gname->gr_name);
return crr;
}
//时间
struct tm * nowtime(time_t time)
{
struct tm *p;
p=localtime(&time);
return p;
}
int stdprint(char * name)
{
struct stat buf;
if(stat(name,&buf)<0)
{
perror("stat");
return -1;
}
char prr[10]="";
char brr[10]="";
char crr[10]="";
permisson(buf.st_mode,prr,10);
printf("%c",type(buf.st_mode));
printf("%s",prr);
printf(" %ld",buf.st_nlink);
printf(" %4ld",buf.st_size);
uid(buf.st_uid,brr);
printf(" %s",brr);
uid(buf.st_gid,crr);
printf(" %s",crr);
struct tm* pa;
pa =nowtime((time_t)buf.st_ctime);
printf(" %d %d %d:%d",pa->tm_mon+1,pa->tm_mday,pa->tm_hour,pa->tm_min);
printf(" %s\n",name);
return 0;
}
主函数
#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include "std2.h"
#include <string.h>
int main(int argc, const char *argv[])
{
if(argc<2)
{
printf("请输入目录名");
return -1;
}
DIR * dr=opendir(argv[1]);
char brr[100]="";
if(dr==NULL)
{
perror("opendir");
}
struct dirent *p=NULL;
while(1)
{
p=readdir(dr);
if(p==NULL)
{
if(errno==0)
{
printf("读取完毕");
return 0;
}
else
{
perror("reddir");
return -1;
}
}
if(p->d_name[0]!='.')
{
strcpy(brr,argv[1]);
strcat(brr,p->d_name);
stdprint(brr);
}
}
closedir(dr);
return 0;
}