linux案例 模拟 ls -l

ls -l  //当前目录下文件的信息

文件权限                 硬链接数  所有者              所在组               大小                最后修改时间              文件名称

ls -l  文件名称 //具体文件的信息

复制代码
 1 #include <stdio.h>
 2 #include <sys/types.h>  //stat
 3 #include <sys/stat.h>   //stat
 4 #include <unistd.h>     //stat
 5 #include <pwd.h>        //getpwuid 
 6 #include <grp.h>        //getgrgid
 7 #include <time.h>       //ctime
 8 #include <string.h>     //strlen  strncpy
 9 
10 // 模拟实现ls -l
11 //文件权限  硬链接数  所有者  所在组 大小  最后修改时间  文件名称
12 int main(int argc, char* argv[])//文件名称, 可执行程序名称或路径
13 {
14     //判断输入的参数是否正确
15     if(argc < 2)
16     {
17         printf("%s filename\n",argv[0]);
18         return -1;
19     }
20     //通过stat函数获取用户传入的文件的信息
21     struct stat st;
22     int ret = stat(argv[1],&st);
23     if(ret == -1)
24     {
25         perror("stat");
26         return -1;
27     }
28     //获取文件类型和文件权限
29     char perms[11] = {0};//10 + 空字符  用于保存文件类型和文件权限的字符串
30     switch(st.st_mode & __S_IFMT)
31     {
32         case __S_IFLNK:
33             perms[0] = 'l';
34             break;
35         case __S_IFDIR:
36             perms[0] = 'd';
37             break;
38         case __S_IFREG:
39             perms[0] = '-';
40             break;
41         case __S_IFBLK:
42             perms[0] = 'b';
43             break;
44         case __S_IFCHR:
45             perms[0] = 'c';
46             break;
47         case __S_IFSOCK:
48             perms[0] = 's';
49             break;
50         case __S_IFIFO:
51             perms[0] = 'p';
52             break;
53         default:
54             perms[0] = '?';
55             break;
56     } 
57     //判断文件的访问权限
58     //文件所有者
59     perms[1] = (st.st_mode & S_IRUSR) ? 'r':'-';
60     perms[2] = (st.st_mode & S_IWUSR) ? 'w':'-';
61     perms[3] = (st.st_mode & S_IXUSR) ? 'x':'-';
62     //文件所在组的权限
63     perms[4] = (st.st_mode & S_IRGRP) ? 'r':'-';
64     perms[5] = (st.st_mode & S_IWGRP) ? 'w':'-';
65     perms[6] = (st.st_mode & S_IXGRP) ? 'x':'-';
66     //其他人权限
67     perms[7] = (st.st_mode & S_IROTH) ? 'r':'-';
68     perms[8] = (st.st_mode & S_IWOTH) ? 'w':'-';
69     perms[9] = (st.st_mode & S_IXOTH) ? 'x':'-';
70     //获取硬链接数
71     int linkNum = st.st_nlink;
72     //文件所有者
73     char* fileUser = getpwuid(st.st_uid)->pw_name;//st_uid:文件所有者id号, 返回结构体中pw_name为用户名
74     //文件所在组
75     char* fileGrp = getgrgid(st.st_gid)->gr_name;
76     //文件大小
77     long int fileSize = st.st_size;
78     //获取修改时间
79     char* time = ctime(&st.st_mtime);
80     char mtime[512] = {0};
81     strncpy(mtime, time, strlen(time) - 1);//ctime默认有个换行 消除换行 复制 - 1 
82     //输出
83     char buf[1024];
84     sprintf(buf,"%s %d %s %s %ld %s %s",perms,linkNum,fileUser,fileGrp,fileSize,mtime,argv[1]);
85     printf("%s\n",buf);
86     return 0;
87 }
复制代码

posted on   廿陆  阅读(5)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示