ls -l 代码实现
- stat.h(库函数)
- stat.c(封装函数)
- main.c(主函数)
- 结果展示
-
stat.h(库函数)
#ifndef __STAT_H__
#define __STAT_H__
int get_permission(mode_t m, char* per); //文件权限
int get_fileType(mode_t m); //文件类型
int get_usrname(uid_t uid); //用户名
int get_grpname(gid_t gid); //组名
#endif
stat.c(封装函数)
#include
#include
#include
#include
#include
#include
#include
#include"stat.h"
//获取文件权限
int get_permission(mode_t m, char* per)
{
int i=0, j = 0;
for(i=8; i>=0; i--)
{
if( (m & (1<
per[j++] = '-';
continue;
}
//能运行到当前位置则说明相应位置不为0
switch(i%3)
{
case 2:
per[j++] = 'r';
break;
case 1:
per[j++] = 'w';
break;
case 0:
per[j++] = 'x';
break;
}
}
per[j] = 0;
return 0;
}
//获取文件类型
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("unknow?n"); break;
}
return 0;
}
//获取文件所属用户
int get_usrname(uid_t uid)
{
struct passwd *pwd = getpwuid(uid);
if(NULL == pwd)
{
printf("getpwuid failedn");
return -1;
}
printf("%st", pwd->pw_name);
return 0;
}
//获取文件所属组用户
int get_grpname(gid_t gid)
{
struct group *grp = getgrgid(gid);
if(NULL == grp)
{
printf("getgrgid failedn");
return -1;
}
printf("%st", grp->gr_name);
return 0;
}
main.c(主函数)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"stat.h"
int main(int argc, const char *argv[])
{
DIR *dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
struct stat buf;
struct dirent *rp = NULL;
while(1)
{
rp = readdir(dp);
if(NULL == rp)
{
if(0 == errno)
{
printf("目录读取完毕n");
return 0;
}
else
{
perror("readdir");
return -1;
}
}
if(rp->d_name[0] == '.')
{
continue;
}
char s[256];
strcpy(s, argv[1]);
stat(strcat(s, rp->d_name), &buf);
//文件类型以及权限
char per[10] = "";
get_fileType(buf.st_mode);
get_permission(buf.st_mode, per);
printf("%s ", per);
//硬链接数
printf("%ld ",buf.st_nlink);
//文件所属用户
get_usrname(buf.st_uid);
//文件所属组用户
get_grpname(buf.st_gid);
//文件大小
printf("%ldt",buf.st_size);
//文件创建日期
struct tm *info = localtime(&buf.st_ctime);
printf("%d月 %02d %02d:%02dt",
info->tm_mon+1, info->tm_mday,
info->tm_hour, info->tm_min);
printf("%sn", rp->d_name);
}
closedir(dp);
return 0;
}
结果展示
读取当前目录
读取其他目录