1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <errno.h>
  6. #include <dirent.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <time.h>
  10.  
  11. #define ERR_EXIT(m) \
  12. do { \
  13. perror(m);\
  14. exit(EXIT_FAILURE);\
  15. }while(0)
  16.  
  17. const char *statbuf_get_perms(struct stat *sbuf);
  18. const char *statbuf_get_date(struct stat *sbuf);
  19. const char *statbuf_get_filename(struct stat *sbuf, const char *name);
  20. const char *statbuf_get_user_info(struct stat *sbuf);
  21. const char *statbuf_get_size(struct stat *sbuf);
  22.  
  23. int main(int argc, const char *argv[])
  24. {
  25. DIR *dir = opendir(".");
  26. if(dir == NULL)
  27. ERR_EXIT("opendir");
  28.  
  29. struct dirent *dr;
  30. while((dr = readdir(dir)))
  31. {
  32. const char *filename = dr->d_name;
  33. if(filename[0] == '.')
  34. continue;
  35.  
  36. char buf[1024] = {0};
  37. struct stat sbuf;
  38. if(lstat(filename, &sbuf) == -1)
  39. ERR_EXIT("lstat");
  40.  
  41. strcpy(buf, statbuf_get_perms(&sbuf));
  42. strcat(buf, " ");
  43. strcat(buf, statbuf_get_user_info(&sbuf));
  44. strcat(buf, " ");
  45. strcat(buf, statbuf_get_size(&sbuf));
  46. strcat(buf, " ");
  47. strcat(buf, statbuf_get_date(&sbuf));
  48. strcat(buf, " ");
  49. strcat(buf, statbuf_get_filename(&sbuf, filename));
  50.  
  51. printf("%s\n", buf);
  52. }
  53.  
  54. closedir(dir);
  55. return 0;
  56. }
  57.  
  58. const char *statbuf_get_perms(struct stat *sbuf)
  59. {
  60. static char perms[] = "----------";
  61. mode_t mode = sbuf->st_mode;
  62.  
  63. //文件类型
  64. switch(mode & S_IFMT)
  65. {
  66. case S_IFSOCK:
  67. perms[0] = 's';
  68. break;
  69. case S_IFLNK:
  70. perms[0] = 'l';
  71. break;
  72. case S_IFREG:
  73. perms[0] = '-';
  74. break;
  75. case S_IFBLK:
  76. perms[0] = 'b';
  77. break;
  78. case S_IFDIR:
  79. perms[0] = 'd';
  80. break;
  81. case S_IFCHR:
  82. perms[0] = 'c';
  83. break;
  84. case S_IFIFO:
  85. perms[0] = 'p';
  86. break;
  87. }
  88.  
  89. //权限
  90. if(mode & S_IRUSR)
  91. perms[1] = 'r';
  92. if(mode & S_IWUSR)
  93. perms[2] = 'w';
  94. if(mode & S_IXUSR)
  95. perms[3] = 'x';
  96. if(mode & S_IRGRP)
  97. perms[4] = 'r';
  98. if(mode & S_IWGRP)
  99. perms[5] = 'w';
  100. if(mode & S_IXGRP)
  101. perms[6] = 'x';
  102. if(mode & S_IROTH)
  103. perms[7] = 'r';
  104. if(mode & S_IWOTH)
  105. perms[8] = 'w';
  106. if(mode & S_IXOTH)
  107. perms[9] = 'x';
  108.  
  109. if(mode & S_ISUID)
  110. perms[3] = (perms[3] == 'x') ? 's' : 'S';
  111. if(mode & S_ISGID)
  112. perms[6] = (perms[6] == 'x') ? 's' : 'S';
  113. if(mode & S_ISVTX)
  114. perms[9] = (perms[9] == 'x') ? 't' : 'T';
  115.  
  116. return perms;
  117. }
  118.  
  119. const char *statbuf_get_date(struct stat *sbuf)
  120. {
  121. static char datebuf[1024] = {0};
  122. struct tm *ptm;
  123. time_t ct = sbuf->st_ctime;
  124. if((ptm = localtime(&ct)) == NULL)
  125. ERR_EXIT("localtime");
  126.  
  127. const char *format = "%b %e %H:%M"; //时间格式
  128.  
  129. if(strftime(datebuf, sizeof datebuf, format, ptm) == 0)
  130. {
  131. fprintf(stderr, "strftime error\n");
  132. exit(EXIT_FAILURE);
  133. }
  134.  
  135. return datebuf;
  136. }
  137.  
  138. const char *statbuf_get_filename(struct stat *sbuf, const char *name)
  139. {
  140. static char filename[1024] = {0};
  141. //name 处理链接名字
  142. if(S_ISLNK(sbuf->st_mode))
  143. {
  144. char linkfile[1024] = {0};
  145. if(readlink(name, linkfile, sizeof linkfile) == -1)
  146. ERR_EXIT("readlink");
  147. snprintf(filename, sizeof filename, " %s -> %s", name, linkfile);
  148. }else
  149. {
  150. strcpy(filename, name);
  151. }
  152.  
  153. return filename;
  154. }
  155.  
  156. const char *statbuf_get_user_info(struct stat *sbuf)
  157. {
  158. static char info[1024] = {0};
  159. snprintf(info, sizeof info, " %3d %8d %8d", sbuf->st_nlink, sbuf->st_uid, sbuf->st_gid);
  160.  
  161. return info;
  162. }
  163.  
  164. const char *statbuf_get_size(struct stat *sbuf)
  165. {
  166. static char buf[100] = {0};
  167. snprintf(buf, sizeof buf, "%8lu", (unsigned long)sbuf->st_size);
  168. return buf;
  169. }

模拟linux下的ls -l命令的更多相关文章

  1. 实现Linux下的ls -l命令

    基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...

  2. 高仿linux下的ls -l命令——C语言实现

    主要用到的函数可以参考头文件,仅仅支持ls -l这功能,扩展就交给大家了0.0 相关测试图片: ​ ​ 话不多说,直接上码 #include <stdio.h> #include < ...

  3. 编程实现Linux下的ls -l

    头文件 #ifndef __FUNC_H__ #define __FUNC_H__ #include <stdio.h> #include <stdlib.h> #includ ...

  4. linux下ls -l命令(即ll命令)查看文件的显示结果分析

    在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...

  5. 终端的乐趣--Linux下有趣的终端命令或者工具【转】

    转自:https://blog.csdn.net/gatieme/article/details/52144603 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  6. linux下如何使用sftp命令【转】

    linux下如何使用sftp命令 from:   http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个 ...

  7. Linux下的一些常用命令(一)

    在Linux环境下敲各种命令是再正常不过了,尤其是现在大多少服务器均为Linux系统,但是我又记不住这么多命令,只是偶尔在项目做完发布到服务器上的时候会涉及到,所以在网上找了一些命令,在此记录一下~ ...

  8. linux下find和grep命令详解

    在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...

  9. 实现linux下的ls

    实现linux下的ls ls的使用 ls -a 列出文件下所有的文件,包括以"."开头的隐藏文件(linux下文件隐藏文件是以.开头的,如果存在..代表存在着父目录). ls -l ...

随机推荐

  1. python进阶八_警告和异常

    心情有点纠结,怎么说呢,倒不是由于其它学习上的事情,反而是由于生活上狗血的剧情逼着人偏离,渐行渐远,人跟人之间有误会也是正常的,可能是由于交流不够,彼此不够了解吧,希望能尽快度过这一段纠结的日子,简单 ...

  2. uva 10817 Headmaster&#39;s Headache 出发dp 位计算

    出发dp,用在一些议题的操作非常~  给出s个课程.m个教师.n个求职者,教师必须招聘.然后招聘一些求职者,使得每一门课都至少有两个老师能教.问题就转换成了招聘哪些求职者使得花费最少.由于s范围小于8 ...

  3. MongoDB学习笔记-维护

    主从复制 MongoDB有主从复制技术,解决高可用和容灾问题,也就是备份. 配置主从的特点: N 个节点的集群 任何节点可作为主节点 所有写入操作都在主节点上 自动故障转移 自动恢复 数据分布式存储 ...

  4. 【转】c#实现字符串倒序的n种写法

    其中LINQ写法最为简洁 //string concatenation with for loop public string ReverseA(string text) {     char[] c ...

  5. QUIC简要

    QUIC.即Quick UDP Internet Connection,类似于SPDY,相同也是由Google公司在现有已存协议之上进行了扩展设计,而旨在降低网络延迟.之前我曾介绍过SPDY的相关信息 ...

  6. JavaFX横幅类游戏开发 教训 游戏贴图

    上一节课,我们即将完成战旗Demo有了一个大概的了解.教训这,我们将学习绘制游戏地图. 由于JavaFX 2.2中添加了Canvas相关的功能,我们就能够使用Canvas来实现游戏绘制了. 游戏地图绘 ...

  7. SpringMVC源码解析- HandlerAdapter - ModelFactory(转)

    ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...

  8. 2014阿里巴巴web前实习生项目分析(1)

    以下简化CSS代码: div.container{ width:500px; background-image:url(/img/sprite.png); background-repeat:no-r ...

  9. WindowState注意事项

    本文将分析具体WindowState个别关键的成员变量和成员函数. Window #3 Window{20dd178e u0 com.android.mms/com.android.mms.ui.Co ...

  10. java流的性能优化1-文件复制

    传统的I/O速度相对照较慢,它会成为系统性能的瓶颈,所以在java1.4之后提供了NIO,它是一种全新的流:它具有下面特性: 1.为全部的原是类型提供Buffer缓存支持: 2.使用java.nio. ...