1、作业要求
用代码实现命令“ls -l”的功能。
2、stat.h文件
#ifndef __STAT_H__
#define __STAT_H__
//获取文件类型
void get_file_type(mode_t mode);
//获取权限
void get_file_mode(mode_t mode);
//获取用户
void get_file_user(struct stat buf);
//获取组用户
void get_file_group(struct stat buf);
//获取时间
void get_file_time(struct stat buf);
#endif
3、stat.c文件
#include<stdio.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>
#include<time.h>
//获取文件类型
void get_file_type(mode_t mode){
switch(mode & 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; //套接字文件
}
}
//获取权限
void get_file_mode(mode_t mode){
int i,j;
for(i=0;i<=6;i+=3){
for(j=0400;j>=0100;j=j/2){
if((mode & (j >> i)) != 0){
switch(j){
case 0400:printf("r");break;
case 0200:printf("w");break;
case 0100:printf("x");break;
}
}
else{
printf("-");
}
}
}
return;
}
//获取所属用户
void get_file_user(struct stat buf){
struct passwd* pwd = getpwuid(buf.st_uid);
if(NULL == pwd){
// perror("getpwuid");
return;
}
printf("%s ",pwd->pw_name);
}
//获取所属组用户
void get_file_group(struct stat buf){
struct group* grp = getgrgid(buf.st_gid);
if(NULL == grp){
perror("getgrgid");
return;
}
printf("%s ",grp->gr_name);
}
//获取时间
void get_file_time(struct stat buf){
char *mon[12]={"一月","二月","三月","四月","五月","六月",\
"七月","八月","九月","十月","十一","十二"};
struct tm* info=NULL;
info=localtime(&buf.st_mtime);
printf("%s %d %02d:%02d ",mon[info->tm_mon],info->tm_mday,\
info->tm_hour,info->tm_min);
}
4、main.c文件
#include<stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include "stat.h"
#define MSG_ERR(msg) {\
printf("line:%d",__LINE__);\
perror(msg);\
}
int main(int argc, const char *argv[])
{
//打开目录文件
DIR *dp = opendir(argv[1]);
if(NULL == dp){
MSG_ERR("opendir");
return -1;
}
//读取目录文件
struct dirent *rp = NULL;
while(1){
rp = readdir(dp);
if(NULL == rp){
if(errno != 0){
MSG_ERR("readdir");
return -1;
}
else{
printf("目录读取完毕\n");
break;
}
}
struct stat buf;
if(rp->d_name[0] != '.'){
if(stat(rp->d_name,&buf)<0){
MSG_ERR("stat");
return -1;
}
//文件类型
get_file_type(buf.st_mode);
//文件权限
get_file_mode(buf.st_mode);
putchar(' ');
//文件硬链接数
printf("%ld ",buf.st_nlink);
//文件所属用户
get_file_user(buf);
//文件所属组用户
get_file_group(buf);
//文件大小
printf("%6ld ",buf.st_size);
//文件的时间
get_file_time(buf);
//文件名
printf("%s\n",rp->d_name);
}
}
//关闭文件
if(closedir(dp)<0){
MSG_ERR("closedir");
return -1;
}
return 0;
}
5、实现效果