模拟linux下的ls -l命令
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #include <dirent.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <time.h>
- #define ERR_EXIT(m) \
- do { \
- perror(m);\
- exit(EXIT_FAILURE);\
- }while(0)
- const char *statbuf_get_perms(struct stat *sbuf);
- const char *statbuf_get_date(struct stat *sbuf);
- const char *statbuf_get_filename(struct stat *sbuf, const char *name);
- const char *statbuf_get_user_info(struct stat *sbuf);
- const char *statbuf_get_size(struct stat *sbuf);
- int main(int argc, const char *argv[])
- {
- DIR *dir = opendir(".");
- if(dir == NULL)
- ERR_EXIT("opendir");
- struct dirent *dr;
- while((dr = readdir(dir)))
- {
- const char *filename = dr->d_name;
- if(filename[0] == '.')
- continue;
- char buf[1024] = {0};
- struct stat sbuf;
- if(lstat(filename, &sbuf) == -1)
- ERR_EXIT("lstat");
- strcpy(buf, statbuf_get_perms(&sbuf));
- strcat(buf, " ");
- strcat(buf, statbuf_get_user_info(&sbuf));
- strcat(buf, " ");
- strcat(buf, statbuf_get_size(&sbuf));
- strcat(buf, " ");
- strcat(buf, statbuf_get_date(&sbuf));
- strcat(buf, " ");
- strcat(buf, statbuf_get_filename(&sbuf, filename));
- printf("%s\n", buf);
- }
- closedir(dir);
- return 0;
- }
- const char *statbuf_get_perms(struct stat *sbuf)
- {
- static char perms[] = "----------";
- mode_t mode = sbuf->st_mode;
- //文件类型
- switch(mode & S_IFMT)
- {
- case S_IFSOCK:
- perms[0] = 's';
- break;
- case S_IFLNK:
- perms[0] = 'l';
- break;
- case S_IFREG:
- perms[0] = '-';
- break;
- case S_IFBLK:
- perms[0] = 'b';
- break;
- case S_IFDIR:
- perms[0] = 'd';
- break;
- case S_IFCHR:
- perms[0] = 'c';
- break;
- case S_IFIFO:
- perms[0] = 'p';
- break;
- }
- //权限
- if(mode & S_IRUSR)
- perms[1] = 'r';
- if(mode & S_IWUSR)
- perms[2] = 'w';
- if(mode & S_IXUSR)
- perms[3] = 'x';
- if(mode & S_IRGRP)
- perms[4] = 'r';
- if(mode & S_IWGRP)
- perms[5] = 'w';
- if(mode & S_IXGRP)
- perms[6] = 'x';
- if(mode & S_IROTH)
- perms[7] = 'r';
- if(mode & S_IWOTH)
- perms[8] = 'w';
- if(mode & S_IXOTH)
- perms[9] = 'x';
- if(mode & S_ISUID)
- perms[3] = (perms[3] == 'x') ? 's' : 'S';
- if(mode & S_ISGID)
- perms[6] = (perms[6] == 'x') ? 's' : 'S';
- if(mode & S_ISVTX)
- perms[9] = (perms[9] == 'x') ? 't' : 'T';
- return perms;
- }
- const char *statbuf_get_date(struct stat *sbuf)
- {
- static char datebuf[1024] = {0};
- struct tm *ptm;
- time_t ct = sbuf->st_ctime;
- if((ptm = localtime(&ct)) == NULL)
- ERR_EXIT("localtime");
- const char *format = "%b %e %H:%M"; //时间格式
- if(strftime(datebuf, sizeof datebuf, format, ptm) == 0)
- {
- fprintf(stderr, "strftime error\n");
- exit(EXIT_FAILURE);
- }
- return datebuf;
- }
- const char *statbuf_get_filename(struct stat *sbuf, const char *name)
- {
- static char filename[1024] = {0};
- //name 处理链接名字
- if(S_ISLNK(sbuf->st_mode))
- {
- char linkfile[1024] = {0};
- if(readlink(name, linkfile, sizeof linkfile) == -1)
- ERR_EXIT("readlink");
- snprintf(filename, sizeof filename, " %s -> %s", name, linkfile);
- }else
- {
- strcpy(filename, name);
- }
- return filename;
- }
- const char *statbuf_get_user_info(struct stat *sbuf)
- {
- static char info[1024] = {0};
- snprintf(info, sizeof info, " %3d %8d %8d", sbuf->st_nlink, sbuf->st_uid, sbuf->st_gid);
- return info;
- }
- const char *statbuf_get_size(struct stat *sbuf)
- {
- static char buf[100] = {0};
- snprintf(buf, sizeof buf, "%8lu", (unsigned long)sbuf->st_size);
- return buf;
- }
模拟linux下的ls -l命令的更多相关文章
- 实现Linux下的ls -l命令
基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...
- 高仿linux下的ls -l命令——C语言实现
主要用到的函数可以参考头文件,仅仅支持ls -l这功能,扩展就交给大家了0.0 相关测试图片: 话不多说,直接上码 #include <stdio.h> #include < ...
- 编程实现Linux下的ls -l
头文件 #ifndef __FUNC_H__ #define __FUNC_H__ #include <stdio.h> #include <stdlib.h> #includ ...
- linux下ls -l命令(即ll命令)查看文件的显示结果分析
在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...
- 终端的乐趣--Linux下有趣的终端命令或者工具【转】
转自:https://blog.csdn.net/gatieme/article/details/52144603 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- linux下如何使用sftp命令【转】
linux下如何使用sftp命令 from: http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个 ...
- Linux下的一些常用命令(一)
在Linux环境下敲各种命令是再正常不过了,尤其是现在大多少服务器均为Linux系统,但是我又记不住这么多命令,只是偶尔在项目做完发布到服务器上的时候会涉及到,所以在网上找了一些命令,在此记录一下~ ...
- linux下find和grep命令详解
在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...
- 实现linux下的ls
实现linux下的ls ls的使用 ls -a 列出文件下所有的文件,包括以"."开头的隐藏文件(linux下文件隐藏文件是以.开头的,如果存在..代表存在着父目录). ls -l ...
随机推荐
- python进阶八_警告和异常
心情有点纠结,怎么说呢,倒不是由于其它学习上的事情,反而是由于生活上狗血的剧情逼着人偏离,渐行渐远,人跟人之间有误会也是正常的,可能是由于交流不够,彼此不够了解吧,希望能尽快度过这一段纠结的日子,简单 ...
- uva 10817 Headmaster's Headache 出发dp 位计算
出发dp,用在一些议题的操作非常~ 给出s个课程.m个教师.n个求职者,教师必须招聘.然后招聘一些求职者,使得每一门课都至少有两个老师能教.问题就转换成了招聘哪些求职者使得花费最少.由于s范围小于8 ...
- MongoDB学习笔记-维护
主从复制 MongoDB有主从复制技术,解决高可用和容灾问题,也就是备份. 配置主从的特点: N 个节点的集群 任何节点可作为主节点 所有写入操作都在主节点上 自动故障转移 自动恢复 数据分布式存储 ...
- 【转】c#实现字符串倒序的n种写法
其中LINQ写法最为简洁 //string concatenation with for loop public string ReverseA(string text) { char[] c ...
- QUIC简要
QUIC.即Quick UDP Internet Connection,类似于SPDY,相同也是由Google公司在现有已存协议之上进行了扩展设计,而旨在降低网络延迟.之前我曾介绍过SPDY的相关信息 ...
- JavaFX横幅类游戏开发 教训 游戏贴图
上一节课,我们即将完成战旗Demo有了一个大概的了解.教训这,我们将学习绘制游戏地图. 由于JavaFX 2.2中添加了Canvas相关的功能,我们就能够使用Canvas来实现游戏绘制了. 游戏地图绘 ...
- SpringMVC源码解析- HandlerAdapter - ModelFactory(转)
ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...
- 2014阿里巴巴web前实习生项目分析(1)
以下简化CSS代码: div.container{ width:500px; background-image:url(/img/sprite.png); background-repeat:no-r ...
- WindowState注意事项
本文将分析具体WindowState个别关键的成员变量和成员函数. Window #3 Window{20dd178e u0 com.android.mms/com.android.mms.ui.Co ...
- java流的性能优化1-文件复制
传统的I/O速度相对照较慢,它会成为系统性能的瓶颈,所以在java1.4之后提供了NIO,它是一种全新的流:它具有下面特性: 1.为全部的原是类型提供Buffer缓存支持: 2.使用java.nio. ...