头文件

#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. poj 2560 Freckles

    题目连接 http://poj.org/problem?id=2560 Freckles Description In an episode of the Dick Van Dyke show, li ...

  2. hdu 2102 A计划

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...

  3. App创意项目助跑计划

    APP创意项目助跑计划 该计划旨在帮助同学们将各种脑中稀奇古怪的想法借助互联网/移动互联网 相关的技术变成真实的项目. 谱写你的故事,从此刻开始! 我们帮助你提高编程(Java.C++.Objecti ...

  4. js jquery 判断IE有效方法

    jquery1.9以前 $.browser.msie jquery1.9更高版本 $.browser.msie = /msie/.test(navigator.userAgent.toLowerCas ...

  5. Android编程: 界面组成、事件监听器

    学习知识:界面组成.事件监听器 ====界面组成==== 1.用户界面的基本组件叫做View,都是继承android.view.View类,Android里面预定义很多基本的界面组件,比如 Butto ...

  6. Python实现kNN(k邻近算法)

    Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...

  7. viewport使用 html5

    viewport 语法介绍: 01 02 width 控制 viewport 的大小,可以指定的一个值或者特殊的值,如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的 ...

  8. 数组和字典 swift

    var array = ["A","B"] var array2:[String] = ["A","B"] var ar ...

  9. cocos游戏的真正入口,用C++实现的demo版本

    1.cocos游戏的出发点 在main函数中有一句:   return CCApplication::sharedApplication()->run(); 2.经过层层深入发现,真正的入口:  ...

  10. DataTable分组归类

    我们在做项目的时候,经常需要根据表或DataTable中某些字段来归类,为此就写出以下方法,帮组需要的人. #region 对DataTable进行分组 + public void GroupData ...