• 作业-11.9


    获得文件属性并且输出到终端上

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include


    void get_file_permission(unsigned int tmp_mod, char file_mod[], int num)
    {
        bzero(file_mod,num);
        unsigned int flag = 1<<9;

        char str[4]="rwx";
        for(int i=0; i<9; i++)
        {
            flag >>= 1;

            if(!(tmp_mod & flag))
            {
                file_mod[i] = '-';
            }else
            {
                file_mod[i] = str[i%3];
            }

        }

    }

    char get_file_type(unsigned int tmp_filetype)
    {
        char file_type[8] = "pcdb-ls";
        unsigned int  num_filetype[7] = {01,02,04,06,010,012,014};
        for(int i=0; i<8; i++)
        {
            if(0 == (tmp_filetype ^ num_filetype[i]))
            {
                return file_type[i];
            }
        }
    }

    int main(int argc, const char *argv[])
    {
        if(argc <2)
        {
            fprintf(stderr, "请从命令行输入文件名\n");
            return -1;
        }

        struct stat buf;
        if(stat(argv[1], &buf) < 0)
        {
            perror("stata");
            return -1;
        }

        //文件的类型和权限
        //printf("st_mode : %o.\n", buf.st_mode);
        char file_mod[10];

        //将buf.st_mode中的文件权限提取出来
        unsigned int tmp_mod = buf.st_mode & ~((~1)<<10);
        unsigned int tmp_filetype = (buf.st_mode & S_IFMT) >> 12;
     

        char c = get_file_type(tmp_filetype);
        printf("%c", c);
        //将文件权限由数字转化为字母
        get_file_permission(tmp_mod, file_mod, 10);

        //打印转换后的文件权限
        printf("%s ", file_mod);

        //硬连接数
        printf("%ld ", buf.st_nlink);

        //文件所属用户
        //printf("%d ", buf.st_uid);
        struct passwd *tmp_usname = getpwuid(buf.st_uid);
        printf("%s ", tmp_usname->pw_name);

        //文件所属组名
        //printf("%d ", buf.st_gid);
        struct group *tmp_groupname = getgrgid(buf.st_gid);
        printf("%s ", tmp_groupname->gr_name);

        //文件大小
        printf("%ld ", buf.st_size);

        //时间
        time_t t = buf.st_ctime;
        struct tm *tmp_time = localtime(&t);
        printf("%d %d %d:%d ", tmp_time->tm_mon+1, tmp_time->tm_mday, \

                   tmp_time->tm_hour , tmp_time->tm_min);


        printf("%s\n", argv[1]);

        return 0;
    }

     

  • 相关阅读:
    『亚马逊云科技产品测评』活动征文|Amazon EC2 的讲解及相关服务
    工具清单 - 项目管理
    河南财经政法大学计算机考研资料汇总
    银行卡OCR API推荐
    MyBatisPlus(二十)防全表更新与删除
    想自学软件测试?一般人我还是劝你算了吧。。。
    JavaScript 概述
    laya---直线移动
    TP-link TL-R473G配置pppoe账号分配网络上网
    var、let、const关键字的特性,以及let、const暂时性死区的作用
  • 原文地址:https://blog.csdn.net/MisakaMikotto/article/details/127777070