请使用目录相关函数以及文件属性相关函数实现:显示指定路径下所有文件属性的功能(除了隐藏文件)。
类似 ls -l 一个目录
func.c :
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
void get_permission(mode_t mode)
{
for(int i = 8; i >= 0; i--)
{
if((mode & (1<<i)) == 0)
{
putchar('-');
}else
{
int res = i % 3;
if(res == 2)
{
putchar('r');
}else if(res == 1)
{
putchar('w');
}else
{
putchar('x');
}
}
}
printf(" ");
}
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("unknown?\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 ", 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 ", grp->gr_name);
return 0;
}
void get_ctime(long int tm)
{
struct tm *info = NULL;
info = localtime(&tm);
printf("%02d-%02d %02d:%02d ", \
info->tm_mon+1, info->tm_mday,\
info->tm_hour, info->tm_min);
}
func.h:
#ifndef __FUNC_H___
#define __FUNC_H___
void get_permission(mode_t mode);
int get_fileType(mode_t m) ;
int get_usrname(uid_t uid) ;
int get_grpname(gid_t gid);
void get_ctime(long int tm);
#endif
ubuntu@ubu
main.c:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include "func.h"
#include <dirent.h>
#include <strings.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char s[100]="";
DIR *dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
while(1)
{
bzero(s,sizeof(s));
strcpy(s,argv[1]);
struct dirent *wj = readdir(dp);
if(NULL == wj)
{
if(0 == perror)
{
printf("文件读取完毕\n");
}else
{
perror("readdiro");
return -1;
}
}
strcat(s,wj->d_name);
struct stat buf;
if(stat(s,&buf) < 0)
{
perror("stat");
return -1;
}
if(wj->d_name[0] == '.')
continue;
get_fileType(buf.st_mode);
get_permission(buf.st_mode);
//硬连接数
printf("%ld ",buf.st_nlink);
//文件所属用户
get_usrname(buf.st_uid);
//文件所属组用户
get_grpname(buf.st_gid);
//文件大小
printf("%ld ",buf.st_size);
//文件创建时间
get_ctime(buf.st_ctime);
//文件名
printf("%s\n",wj->d_name);
}
return 0;
}
结果展示: