类似 ls -l 的函数
引用的头文件和宏定义
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <grp.h>
#include <pwd.h>
#include<time.h>
#include<string.h>
#include<dirent.h>
#include<errno.h>
#define PER(per) { fprintf(stderr,"line: %d ",__LINE__);\
perror(per);\
return;}
将获得的文件权限信息转化为"rwx-"的形式
int file_power(mode_t m,char *per)
{
int i=8;
while(i>-1)
{
char x;
switch(i%3)
{
case 2:x='r';
break;
case 1:x='w';
break;
case 0:x='x';
break;
}
if((m & 1<<i )!=0)
{
per[8-i]=x;
}
else
{
per[8-i]='-';
}
i--;
}
per[9]='\0';
return 0;
}
将文件属性转化为“bcd-lsp”
int get_fileType(mode_t m,char* p)
{
switch (m & S_IFMT)
{
case S_IFBLK: *p='b'; break;
case S_IFCHR: *p='c'; break;
case S_IFDIR: *p='d'; break;
case S_IFIFO: *p='p'; break;
case S_IFLNK: *p='l'; break;
case S_IFREG: *p='-'; break;
case S_IFSOCK: *p='s'; break;
default: printf("unknown?\n"); break;
}
return 0;
}
通过uid获得文件的所属用户名
int get_usrname(uid_t uid,char *u)
{
struct passwd* pwd=getpwuid(uid);
if(NULL==pwd)
{
printf("getpwuid failed\n");
return -1;
}
strcat(u,pwd->pw_name);
return 0;
}
通过gid获得文件的所属组用户名
int get_grpname(gid_t gid,char *g)
{
struct group* grp=getgrgid(gid);
if(NULL==grp)
{
printf("getgrgid failed\n");
return -1;
}
strcat(g,grp->gr_name);
return 0;
}
通过文件名显示文件详细信息
void show(const char *name)
{
struct stat buf;
if( stat(name,&buf)<0)
{
PER("stat");
}
char p;
get_fileType(buf.st_mode,&p);
char per[20];
file_power(buf.st_mode,per);
printf("%c%s ",p,per);
printf("%ld ",buf.st_nlink);
char u[20]="";
get_usrname(buf.st_uid,u);
printf("%s ",u);
char g[20]="";
get_grpname(buf.st_gid,g);
printf("%s ",g);
printf("%ld ",buf.st_size);
struct tm* info=localtime(&buf.st_ctime);
printf("%d-%02d-%02d %02d:%02d ",info->tm_year+1900,info->tm_mon+1,info->tm_mday,
info->tm_hour,info->tm_min);
printf("%s\n",name);
}
从目录里读取文件名,并显示文件详细信息(不包括隐藏文件)
void dir_ll(const char *dir)
{
DIR* dp=opendir(dir);
if(NULL==dp)
{
PER("opendir");
}
struct dirent* rp=NULL;
while (1)
{
int i=1;
rp=readdir(dp);
if (NULL==rp)
{
if(0==errno)
{
if(i%6!=0)
printf("\n");
printf("目录读取完毕\n");
break;
}
else
{
PER("readdir");
}
}
if('.'==rp->d_name[0])
{
continue;
}
char n[100]="";
strcat(n,dir);
strcat(n,rp->d_name);
show(n);
i++;
}
closedir(dp);
}
主函数
int main(int argc, const char *argv[])
{
dir_ll(argv[1]);
return 0;
}
全部函数
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <grp.h>
#include <pwd.h>
#include<time.h>
#include<string.h>
#include<dirent.h>
#include<errno.h>
#define PER(per) { fprintf(stderr,"line: %d ",__LINE__);\
perror(per);\
return;}
int file_power(mode_t m,char *per)
{
int i=8;
while(i>-1)
{
char x;
switch(i%3)
{
case 2:x='r';
break;
case 1:x='w';
break;
case 0:x='x';
break;
}
if((m & 1<<i )!=0)
{
per[8-i]=x;
}
else
{
per[8-i]='-';
}
i--;
}
per[9]='\0';
return 0;
}
int get_fileType(mode_t m,char* p)
{
switch (m & S_IFMT)
{
case S_IFBLK: *p='b'; break;
case S_IFCHR: *p='c'; break;
case S_IFDIR: *p='d'; break;
case S_IFIFO: *p='p'; break;
case S_IFLNK: *p='l'; break;
case S_IFREG: *p='-'; break;
case S_IFSOCK: *p='s'; break;
default: printf("unknown?\n"); break;
}
return 0;
}
int get_usrname(uid_t uid,char *u)
{
struct passwd* pwd=getpwuid(uid);
if(NULL==pwd)
{
printf("getpwuid failed\n");
return -1;
}
strcat(u,pwd->pw_name);
return 0;
}
int get_grpname(gid_t gid,char *g)
{
struct group* grp=getgrgid(gid);
if(NULL==grp)
{
printf("getgrgid failed\n");
return -1;
}
strcat(g,grp->gr_name);
return 0;
}
void show(const char *name)
{
struct stat buf;
if( stat(name,&buf)<0)
{
PER("stat");
}
char p;
get_fileType(buf.st_mode,&p);
char per[20];
file_power(buf.st_mode,per);
printf("%c%s ",p,per);
printf("%ld ",buf.st_nlink);
char u[20]="";
get_usrname(buf.st_uid,u);
printf("%s ",u);
char g[20]="";
get_grpname(buf.st_gid,g);
printf("%s ",g);
printf("%ld ",buf.st_size);
struct tm* info=localtime(&buf.st_ctime);
printf("%d-%02d-%02d %02d:%02d ",info->tm_year+1900,info->tm_mon+1,info->tm_mday,
info->tm_hour,info->tm_min);
printf("%s\n",name);
}
void dir_ll(const char *dir)
{
DIR* dp=opendir(dir);
if(NULL==dp)
{
PER("opendir");
}
struct dirent* rp=NULL;
while (1)
{
int i=1;
rp=readdir(dp);
if (NULL==rp)
{
if(0==errno)
{
if(i%6!=0)
printf("\n");
printf("目录读取完毕\n");
break;
}
else
{
PER("readdir");
}
}
if('.'==rp->d_name[0])
{
continue;
}
char n[100]="";
strcat(n,dir);
strcat(n,rp->d_name);
show(n);
i++;
}
closedir(dp);
}
int main(int argc, const char *argv[])
{
dir_ll(argv[1]);
return 0;
}