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

  1. /*************************************************************************
  2. > File Name: dirwalk.c
  3. > Author:
  4. > Mail:
  5. > Created Time: Tue 31 Mar 2015 11:56:38 AM CST
  6. ************************************************************************/
  7.  
  8. #include<stdio.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <fcntl.h>
  12. #include <unistd.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <dirent.h>
  16. #include <time.h>
  17.  
  18. #define MAX_PATH 1024
  19. #define MODE_LEN 10
  20. #define TIME_LEN 20
  21. #define NAME_LEN 30
  22.  
  23. unsigned long ugo_mode[] = {S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH};
  24. char* rwx[] = {"r", "w", "x"};
  25. char* userpath = "/etc/passwd";
  26. char* grouppath = "/etc/group";
  27.  
  28. /*dirwalk: apply fcn to all files in dir */
  29. void dirwalk(char* dir, void(*fcn)(char*))
  30. {
  31. struct dirent *dp;
  32. DIR* dfd;
  33.  
  34. char name[MAX_PATH];
  35. if((dfd = opendir(dir)) == NULL)
  36. {
  37. fprintf(stderr, "dirwalk: can't open %s\n", dir);
  38. return;
  39. }
  40.  
  41. while((dp = readdir(dfd)) != NULL)
  42. {
  43. if(strcmp(dp->d_name, ".") == || strcmp(dp->d_name, "..") == )
  44. {
  45. continue;
  46. }
  47.  
  48. if(strlen(dir) + strlen(dp->d_name) + > sizeof(name))
  49. {
  50. fprintf(stderr, "%s/%s too long\n", dir, dp->d_name);
  51. }else
  52. {
  53. sprintf(name, "%s/%s", dir, dp->d_name);
  54. (*fcn)(name);
  55. }
  56. }
  57. closedir(dfd);
  58. }
  59.  
  60. /*getname: get the name of the user and the name of the group name */
  61. void getname(char* path, int id, char* name)
  62. {
  63.  
  64. int fd, save_fd;
  65. if((fd = open(path, O_RDONLY)) < )
  66. {
  67. perror("open \n");
  68. exit();
  69. }
  70.  
  71. save_fd = dup(STDIN_FILENO);
  72. dup2(fd, STDIN_FILENO);
  73. close(fd);
  74. char p[MAX_PATH];
  75. char usrid[];
  76. sprintf(usrid, "%d", id);
  77. char* puid;
  78. while((scanf("%s", p)) != EOF)
  79. {
  80. if((puid = strstr(p, usrid)) != NULL)
  81. {
  82. char* pFlag;
  83. char* pResult;
  84. if((pFlag = strstr(p, ":")) != NULL)
  85. {
  86. pResult = pFlag;
  87. pFlag = strstr(pFlag + , ":");
  88. }
  89. if(pFlag != NULL)
  90. {
  91. if((memcmp(pFlag + , puid, strlen(usrid))) == )
  92. {
  93. *pResult = '\0';
  94. strcpy(name, p);
  95. }
  96. }
  97. //printf("%s\n", puid);
  98. }
  99. }
  100.  
  101. dup2(save_fd, STDIN_FILENO);
  102. close(save_fd);
  103. }
  104.  
  105. /*getmode: get the mode of a file in string format by st_mode */
  106. void getmode(unsigned long st_mode, char* mode)
  107. {
  108. switch(st_mode & S_IFMT)
  109. {
  110. case S_IFDIR:
  111. mode[] = 'd';
  112. break;
  113. case S_IFIFO:
  114. mode[] = 'p';
  115. break;
  116. case S_IFBLK:
  117. mode[] = 'b';
  118. break;
  119. case S_IFCHR:
  120. mode[] = 'c';
  121. break;
  122. case S_IFREG:
  123. mode[] = '-';
  124. break;
  125. case S_IFLNK:
  126. mode[] = 'l';
  127. break;
  128. case S_IFSOCK:
  129. mode[] = 's';
  130. break;
  131. default:
  132. mode[] = 'u';
  133. break;
  134. }
  135.  
  136. int i;
  137. for(i = ; i < ; ++i)
  138. {
  139. if(st_mode & ugo_mode[i])
  140. {
  141. strcat(mode, rwx[i % ]);
  142. }else
  143. {
  144. strcat(mode, "-");
  145. }
  146. }
  147. }
  148.  
  149. /*gettime: get the time in string format */
  150. void gettime(const time_t ct, char* time)
  151. {
  152. char* tmp = ctime(&ct);
  153. time[] = tmp[];
  154. time[] = tmp[];
  155. time[] = tmp[];
  156. time[] = ' ';
  157.  
  158. struct tm* tm_buf = gmtime(&ct);
  159. char last[];
  160. sprintf(last, "%02d %02d:%02d", tm_buf->tm_mday, tm_buf->tm_hour, tm_buf->tm_min);
  161. strcat(time, last);
  162. }
  163.  
  164. /* print the file name and the size of the "name" */
  165. void fsize(char* name)
  166. {
  167. struct stat st_buf;
  168. if(stat(name, &st_buf) < )
  169. {
  170. fprintf(stderr, "fsize: can't access %s\n", name);
  171. return;
  172. }
  173.  
  174. if((st_buf.st_mode & S_IFMT) == S_IFDIR)
  175. {
  176. dirwalk(name, fsize);
  177. }
  178. char* time = (char*)malloc(sizeof(char) * TIME_LEN);
  179. memset(time, , TIME_LEN);
  180. gettime(st_buf.st_atime, time);
  181.  
  182. char* mode = (char*)malloc(sizeof(char) * MODE_LEN);
  183. memset(mode, , MODE_LEN);
  184. getmode(st_buf.st_mode, mode);
  185.  
  186. char* username = (char*)malloc(sizeof(char) * NAME_LEN);
  187. memset(username, , NAME_LEN);
  188. getname(userpath, st_buf.st_uid, username);
  189.  
  190. char* groupname = (char*)malloc(sizeof(char) * NAME_LEN);
  191. memset(groupname, , NAME_LEN);
  192. getname(grouppath, st_buf.st_gid, groupname);
  193.  
  194. printf("%s %d %s %s %4ld %s %s\n", mode, (int)st_buf.st_nlink, username, groupname, st_buf.st_size, time, name);
  195. free(groupname);
  196. free(username);
  197. free(mode);
  198. free(time);
  199. }
  200.  
  201. int main(int argc, char* argv[])
  202. {
  203. if(argc == )
  204. fsize(".");
  205. while(--argc)
  206. fsize(*++argv);
  207. return ;

实现Linux下的ls -l命令的更多相关文章

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

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

  2. 模拟linux下的ls -l命令

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  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下如何使用sftp命令【转】

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

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

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

  7. linux下find和grep命令详解

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

  8. 实现linux下的ls

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

  9. 在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法。(转)

    在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法. 一般我们在使用cp命令时加上-f选项,希望不让出现“overwrite”的提示(文件覆盖的提示).如:# cp ...

随机推荐

  1. font-size:100%和font-size:0

    h1,h2,h3,h4,h5,h6 {font-size:100%;} 正常情况下hx按照一定百分比增加字号,但是指定font-size:100%;就会继承body设置的字体大小 font-size: ...

  2. Linux 下常用命令

    linux 下常用命令: 1.删除文件命令为 rm 2.创建目录的命令是:mkdir 3.删除目录的命令是rmdir(空目录) 4.切换到root帐号:su 5.查看所有进程:ps -aux 6.杀死 ...

  3. 使用ANT打包Android应用

    大家好,今天来分享一下如何使用ANT打包Android应用. 通常我们习惯用eclipse来开发Android程序,它会自动帮我们打包当前的应用程序.如果在Navigator视图下,我们可以看到以下几 ...

  4. 使用Spring框架的12个开源项目

    使用Spring框架的12个开源项目 http://www.csdn.net/article/2013-10-14/2817176-open-source-projects-that-use-spri ...

  5. zoj 3351 Bloodsucker(概率 dp)

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 dp[i]表示现在存在i个吸血鬼要达成目标(全为吸血鬼)天数的数学 ...

  6. urllib

    urllib Python 标准库 urllib2 的使用细节 python 2.x 3.x from urllib import request with request.urlopen('http ...

  7. 解决iframe缓存

    网上能搜到很多此类的资料,但都是互相转载,不太起作用.这几天写个用到,用了不少的iframe效果.结果发现iframe有缓存的问题.网上提供了思路,即对iframe的href后添加随即get值,来逃避 ...

  8. JAVA方法和本地方法(转载)

    转载自:http://blog.sina.com.cn/s/blog_5b9b4abe01016zw0.html JAVA中有两种方法:JAVA方法和本地方法   JAVA方法是由JAVA编写的,编译 ...

  9. xmlns 属性

    xmlns 属性 xmlns 属性可以在文档中定义一个或多个可供选择的命名空间.该属性可以放置在文档内任何元素的开始标签中.该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属 ...

  10. oracle 有关大数据

    一. oracle大数据量分区后查询效率低下的一些建议: 1 对于当前表tm_bus_realtime_log.查看它的索引,只有一个(索引名:INDEX_BUS_REALTIME 字段名:UPLOA ...