完成如下需求:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
//文件属性
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_permission(mode_t m)
{
int i=0;
for(i=8; i>=0; i--)
{
if( (m & (1<<i)) == 0)
{
printf("-");
continue;
}
//能运行到当前位置则说明相应位置不为0
switch(i%3)
{
case 2:
printf("r");
break;
case 1:
printf("w");
break;
case 0:
printf("x");
break;
}
}
return 0;
}
//获取用户的uid
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 main(int argc, const char *argv[])
{
//进入自己选择的目录
DIR* dp=opendir(argv[1]);
if(NULL==dp){
perror("opendir");
return -1;
}
struct dirent* rp=NULL;
struct stat buf;
char str[100]="";
while(1){
//获取该目录下的文件名
rp=readdir(dp);
if(NULL==rp){
if(0==errno){ //没有更新错误码,目录被读取到结尾
break;
}
else{
perror("readdir");
return -1;
}
}
//不打印隐藏文件
if(rp->d_name[0]!='.'){
//获取文件属性
strcpy(str,argv[1]);
strcat(str,rp->d_name);
if(stat(str,&buf)<0){
perror("stat");
return -1;
}
//本轮获得的文件类型以及权限的打印
get_fileType(buf.st_mode);
get_permission(buf.st_mode);
//打印硬链接数
printf(" %ld ",buf.st_nlink);
//获得用户的uid
get_usrname(buf.st_uid);
//获得组用户的uid
struct group *G=getgrgid(buf.st_gid); //调用grp.h里面的库函数getgrgid获得结构体
printf("%s ",G->gr_name); //打印结构体里得到的名字
//文件大小
printf(" %ld\t",buf.st_size);
//a
struct tm* S=localtime(&buf.st_mtime);
printf("%d月 %d日 %d:%d ",S->tm_mon+1,S->tm_mday,S->tm_hour,S->tm_sec);
printf(" %s\n",rp->d_name);
}
}
closedir(dp);
return 0;
}
实验结果如下图所示:
标准ls -l命令如下: