头文件

#ifndef __FUNC_H__
#define __FUNC_H__ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>
#include <grp.h> #define ENT_CNT 128
#define FILE_LEN 256 int get_file_name(DIR* pdir,char* dirname ,char names[][FILE_LEN]);
void str_sort(char arr[][FILE_LEN], int cnt);
void show_ent(char name[][FILE_LEN], int cnt);
void mode_to_str(mode_t mode, char* dest);
char* time_format(char* src); #endif

主函数

/*************************************************************************
> File Name: func.c
> Author: KrisChou
> Mail: zhoujx0219@163.com
> Created Time: Tue 19 Aug 2014 02:31:34 PM CST
************************************************************************/
#include "func.h" int main(int argc, char* argv[])
{
DIR* pdir ;
struct dirent *pent ;
    
    char file_names[ENT_CNT][FILE_LEN] ;
int cnt ; //所遍历目录子项的个数
char pold[128]=""; //记录程序原来的工作路径
char pnew[128]="."; //记录所需遍历目录的绝对路径,使用stat获取文件信息需要绝对路径(除非程序遍历当前目录)
getcwd(pold, 128);
if(argc == 2)
{
pdir = opendir(argv[1]);
chdir(argv[1]);
getcwd(pnew, 128);
chdir(pold);
}else if(argc == 1)
{
pdir = opendir("."); }else
{
printf("USAGE: EXE DIR \n");
exit(1);
} if(pdir == NULL)
{
perror("opendir");
exit(1);
}
cnt = get_file_names(pdir,pnew ,file_names); //将每一项的 绝对路径(pnew) + filename 存入数组,以便stat获取文件信息
str_sort(file_names, cnt);
show_ent(file_names, cnt);
return 0 ;
}

1. get_file_name

/*************************************************************************
> File Name: ./src/get_file_name.c
> Author: KrisChou
> Mail:zhoujx0219@163.com
> Created Time: Tue 19 Aug 2014 03:03:23 PM CST
************************************************************************/ #include "func.h"
int get_file_names(DIR* pdir, char* dirname, char names[][FILE_LEN])
{
struct dirent* pent ;
int cnt = 0 ;
while( (pent = readdir(pdir)) != NULL )
{
if(strncmp(pent ->d_name, ".", 1) == 0 || strncmp(pent ->d_name, "..", 2) == 0)
{
continue ;
}
strcpy(names[cnt],dirname);
strcat(names[cnt], "/");
strcat(names[cnt], pent -> d_name);
cnt ++ ;
}
closedir(pdir);
return cnt ; }

2. str_sort

/*************************************************************************
> File Name: ./src/str_sort.c
> Author: KrisChou
> Mail:zhoujx0219@163.com
> Created Time: Tue 19 Aug 2014 03:19:05 PM CST
************************************************************************/
#include "func.h" static int my_cmp(const void* left, const void* right )
{
return strcmp((char* )left , (char*)right);
} void str_sort(char arr[][FILE_LEN], int cnt)
{
qsort(arr, cnt, FILE_LEN, my_cmp);
}

3. show_ent

/*************************************************************************
> File Name: show_ent.c
> Author: KrisChou
> Mail:zhoujx0219@163.com
> Created Time: Tue 19 Aug 2014 02:36:17 PM CST
************************************************************************/
#include "func.h" void show_ent(char name[][FILE_LEN], int cnt)
{
struct stat my_stat ;
char buf[11]="";
char *pstr ;
int index ;
for(index = 0; index < cnt; index ++)
{
memset(&my_stat, 0, sizeof(my_stat));
if( stat(name[index], &my_stat) == -1 )
{
perror("stat");
exit (1);
}
mode_to_str(my_stat.st_mode, buf);
pstr = ctime(&(my_stat.st_atime));//Mon Aug 18 14:37:40 2014
pstr = time_format(pstr);
printf("%10s.%2d%7s%7s%5d%13s %s\n",buf, my_stat.st_nlink, getpwuid(my_stat.st_uid)->pw_name, getgrgid(my_stat.st_gid) ->gr_name, my_stat.st_size, pstr,name[index]); }
}

3.1 mode_to_str

/*************************************************************************
> File Name: mode_to_str.c
> Author: KrisChou
> Mail:zhoujx0219@163.com
> Created Time: Tue 19 Aug 2014 02:32:33 PM CST
************************************************************************/
#include "func.h" void mode_to_str(mode_t mode, char* dest)
{
memset(dest,'-',10);
if(S_ISDIR(mode))
{
dest[0]='d';
}
if(S_ISREG(mode))
{
dest[0]='-';
} if(mode & S_IRUSR)
{
dest[1] = 'r' ;
}
if(mode & S_IWUSR)
{
dest[2] = 'w' ;
}
if(mode & S_IXUSR)
{
dest[3] = 'x' ;
}
if(mode & S_IRGRP)
{
dest[4] = 'r' ;
}
if(mode & S_IWGRP)
{
dest[5] = 'w' ;
}
if(mode & S_IXGRP)
{
dest[6] = 'x' ;
}
if(mode & S_IROTH)
{
dest[7] = 'r' ;
}
if(mode & S_IWOTH)
{
dest[8] = 'w' ;
}
if(mode & S_IXOTH)
{
dest[9] = 'x' ;
}
}

3.2 time_format

/*************************************************************************
> File Name: time_format.c
> Author: KrisChou
> Mail:zhoujx0219@163.com
> Created Time: Tue 19 Aug 2014 02:35:12 PM CST
************************************************************************/
#include "func.h" char* time_format(char* src)
{
int index = strlen(src) - 1 ;
for(; src[index]!=':'; index -- )
{ }
src[index] = '\0' ;
return src + 4 ;
}

Makefile

SRC_DIR := ./src
INC_DIR := ./include
EXE_DIR := ./bin
OBJECTS := $(wildcard $(SRC_DIR)/*.c)
INCLUDES :=$(wildcard $(INC_DIR)/*.h)
CC := gcc
FLAGS := -o
$(EXE_DIR)/main : $(OBJECTS) $(INCLUDES)
$(CC) $(FLAGS) $@ $(OBJECTS) -I$(INC_DIR)
 

编程实现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命令

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

  4. 实现linux下的ls

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

  5. 【Linux基础】linux下修改ls显示的时间格式

    1.修改ls显示格式 ls -l --time-style '+%Y/%m/%d %H:%M:%S' drwxr-x--- edwetl edwetl // :: arc_test ls -l --t ...

  6. linux下出现+ ls --color=auto -l --color=auto...++ echo -ne '\033]0;root@imon-2:~'等

    [root@imon-2 ~]# cd /root/ + cd /root/ ++ echo -ne '\033]0;root@imon-2:~' [root@imon-2 ~]# ll + ls - ...

  7. linux下实现ls()函数遍历目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...

  8. Linux下用ls和du命令查看文件以及文件夹大小

    ls的用法 ls -l |grep "^-"|wc -l或find ./company -type f | wc -l  查看某文件夹下文件的个数,包括子文件夹里的. ls -lR ...

  9. [C++]linux下实现ls()函数遍历目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...

随机推荐

  1. ubuntu14.04字符界面中文乱码及中文输入

    作为ubuntu用户字符界面是绝对不陌生的,尤其是维护管理服务器的朋友为了节省资源都是用的字符界面,但是默认字符界面中文目录文件都是乱码,根本无法打开编辑,那么怎么让字符界面显示中文目录文件,还有在字 ...

  2. MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门

    MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshell.c ...

  3. Swift TabeleViewCell dequeueReusableCellWithIdentifier 使用的新的细节,原来现在可以这样

    今天在看官方的TableView Guide,突然想起来最近写的一个代码中实现tableViewCell复用的时候有点问题: var cell = UITableViewCell(style: UIT ...

  4. Some Tips About VS2015

    Xaml edit bug about vs2013+ sometimes, vs will say some class not found in the namespace. but, we co ...

  5. P1179: [Apio2009]Atm

    缩点+spfa最短路,因为最终不可能有环,所以直接spfa. ; type node=record f,t:longint; end; var n,m,s,i,j,ans,cnt,num,u,x,dg ...

  6. 字符串流sstream[part1/基本知识]

    C++中的输入输出分为三种:基于控制台的I/O,即istream.ostream.iostream:基于文件的I/O,即ifstream.ofstream.fstream:基于字符串的I/O,即ist ...

  7. Teamwork——Week4 团队项目之NABC

    项目框架——NABC模型 一.N(Need需求) 我们组主要的用户对象是第三小组——UI小组的同学们,因此我们的用户需求就是他们的数据需求. 1)提供给UI小组整理好的数据库,和前一组讨论好数据结构. ...

  8. 小组开发项目针对性的NABC分析

    单独就我们团队开发项目——重力解锁的功能特点而言,我们解决了智能手机屏幕解锁的乏味和繁琐的特点,显得更有趣味性和独特性,更符合现代人追随时尚的潮流:我们根据个人的不同喜好和便利性来设定一些动作,利用重 ...

  9. 找出1-N中1的个数

    一.题目 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5. ...

  10. 查看javadoc

    在 选中的jar包右键 properties 在javadoc里面引入api的路径 比如我要查看 spring的javadoc, 导入这个文件夹: E:\Java\spring-framework-2 ...