用io目录操作实现与Linux终端 ls-l命令一样功能代码

发布于:2023-01-04 ⋅ 阅读:(267) ⋅ 点赞:(0)

/*===============================================
 *   文件名称:hw2.c
 *   创 建 者:     
 *   创建日期:2022年08月24日
 *   描    述:
 ================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <time.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char *argv[])

    int ret=0;
    struct dirent *info=NULL;
    struct stat buf;
    struct tm *t=NULL;
    struct passwd *p=NULL;
    struct group *g=NULL;

    //打开目录
    DIR *dfp=opendir(".");
    if(dfp == NULL)
    {
        perror("opendir");
        return -1;    
    }

    //循环读取目录项--得到文件名
    while ((info=readdir(dfp))!=NULL)
    {
        if(info->d_name[0]!='.')//不显示隐藏文件
        {
            ret=lstat(info->d_name,&buf);//获取指定文件的属性
            if(ret<0)
            {
                perror("lstat");
                return -1;
            }
            p=getpwuid(buf.st_uid);//通过用户id得到用户名
            g=getgrgid(buf.st_gid);//通过用户组id得到用户组名

            switch(buf.st_mode&S_IFMT)//得到文件类型 st_mode&文件类型掩码==对应文件类型宏,则表示为该文件类型
            {
                case S_IFREG: printf("-");break;
                case S_IFDIR:printf("d");break;

            }

            int i=0;
            for(i=8;i>=0;i--)//获取文件权限st_mode &权限宏==宏本身 表示具有该权限
            {
                if(buf.st_mode &(1<<i))
                {
                    switch(i%3)
                    {
                        case 2:printf("r");break;
                        case 1:printf("w");break;
                        case 0:printf("x");break;
                    }
                }
                else
                {
                    printf("-");
                }
            }
            printf(" %ld",buf.st_nlink);//得到文件硬链接书
            printf("  %s  %s",p->pw_name,g->gr_name);
            printf("  %-8ld",buf.st_size);//得到文件的大小
            t=localtime(&buf.st_mtime);//将文件最后一次修改时间的秒数转换为本地时间
            printf(" %d月%d日 %02d:%02d",t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);
            printf(" %s\n",info->d_name);//打印文件名

        }
    }

    return 0;
}

 

 


网站公告

今日签到

点亮在社区的每一天
去签到