2023/2/24 linux利用opendir与stat函数的结合应用。

  1. 利用opendir打开一个目录,打印出该目录下除隐藏文件以外的文件信息,类似(ls-l)的效果。

//输入一个外部目录路径,要求显示该路径下,所有文件的详细信息,除了隐藏文件
#include "head.h"
//判断文件的类别
char get_filemix(mode_t mode)
{
    switch(mode & S_IFMT)
    {
    case S_IFSOCK: return 's';
    case S_IFLNK: return 'l';
    case S_IFREG: return '-';
    case S_IFBLK: return 'b';
    case S_IFDIR: return 'd';
    case S_IFCHR: return 'c';
    case S_IFIFO: return 'p';
    }
    return 'T';
}
//判断文件的执行权限
void get_filePermission(mode_t mode)
{
    char arr[]="rwx";
    for(int i=0;i<9;i++)
    {
        if(mode&(0400>>i)==0)
        {
            printf("%c",'-');
        }
        else
        {
            printf("%c",arr[i%3]);
        }
    }
    printf("\t");
}
//计算文件用户
void file_uid(uid_t uid)
{
    struct passwd *ugd=getpwuid(uid);
    printf("%s\t",ugd->pw_name);
    return;
}
//计算文件的组用户
void file_gid(gid_t gid)
{
    struct group *ggd=getgrgid(gid);
    printf("%s\t",ggd->gr_name);
        return;
}
//计算文件的日期
void get_month(int tm_mon,char mon[])
{
    switch(tm_mon)
    {
    case 0:
        strcpy(mon,"一月");
        break;
    case 1:
        strcpy(mon,"二月");
        break;
    case 2:
        strcpy(mon,"三月");
        break;
    case 3:
        strcpy(mon,"四月");
        break;
    case 4:
        strcpy(mon,"五月");
        break;
    case 5:
        strcpy(mon,"六月");
        break;
    case 6:
        strcpy(mon,"七月");
        break;
    case 7:
        strcpy(mon,"八月");
        break;
    case 8:
        strcpy(mon,"九月");
        break;
    case 9:
        strcpy(mon,"十月");
        break;
    case 10:
        strcpy(mon,"十一月");
        break;
        case 11:
        strcpy(mon,"十二月");
        break;
    }
}
//主函数
int main(int argc, const char *argv[])
{

    if(argc<2)
    {
    //    printf("请输入目录路径\n");
        return -1;
    }
    printf("请输入目录路径: ");
    DIR *Pa=opendir(argv[1]);
    if(NULL==Pa)
    {
        ERR_MSG("open");
        return -1;
    }
    struct dirent *Pb=NULL;
    int i=0;
    while(1)
    {
        Pb=readdir(Pa);//结构体 d_name存放文件的文件名
        if(Pb==NULL)//分为两种情况
        {
            if(errno==0)//文件读取完毕,不更新的errno为0
            {
                printf("文件读取完毕\n");
                break;//终止循环,不终止函数
            }
            else
            {
                ERR_MSG("readdir");
                return -1;//函数或文件出错,终止函数
            }
        }
        //打印文件中的详细信息
    struct stat buf;
    char name[32]="";
    strcpy(name,Pb->d_name);
    if(stat(name,&buf)<0)//第一个参数直接填字符串时不需要加上""
    {
        ERR_MSG("stat");
        return -1;
    }
//判断文件的类别
    get_filemix(buf.st_mode);
    printf("%c",get_filemix(buf.st_mode)); 
//输出文件中的执行权限
    get_filePermission(buf.st_mode);
//硬链接数
    printf("%lu\t",buf.st_nlink);
//计算文件的用户
//    char arr_uid[32]="";
    file_uid(buf.st_uid);
//计算文件的组用户
//    char arr_gid[32]="";
    file_gid(buf.st_gid);
//文件的大小
    printf("%ld\t",buf.st_size);
//计算文件的日期
    struct tm *Pc=localtime(&buf.st_ctime);
    char mon[32]="";
    get_month(Pc->tm_mon,mon);
    fprintf(stdout,"%s %02d;%02d;%02d\n",mon,Pc->tm_mday,Pc->tm_hour,Pc->tm_min);

    }
    if(closedir(Pa)<0)
    {
        ERR_MSG("closedir");
        return -1;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值