编程实现Linux下的ls -l

头文件

#ifndef __FUNC_H__
#define __FUNC_H__

#include<stdio.h>
#include <stdio.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: [email protected]
  > Created Time: Tue 19 Aug 2014 02:31:34 PM CST
 ************************************************************************/
#include "func.h"

int main(int argc, char* argv[])
{
    DIR* pdir ;
    char file_names[ENT_CNT][FILE_LEN] ;
    int cnt ; //所遍历目录子项的个数
    struct dirent *pent ;
    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:[email protected]
  > 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:[email protected]
    > 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:[email protected]
  > 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:[email protected]
  > 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:[email protected]
    > 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) [email protected] $(OBJECTS) -I$(INC_DIR)
 

编程实现Linux下的ls -l,布布扣,bubuko.com

时间: 2024-12-29 07:28:02

编程实现Linux下的ls -l的相关文章

实现Linux下的ls -l命令

基本实现了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 ******************

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

主要用到的函数可以参考头文件,仅仅支持ls -l这功能,扩展就交给大家了0.0 相关测试图片: ? ? 话不多说,直接上码 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/stat.h> 5 #include <sys/types.h> 6 #include <string.h> 7 #include <time.h

模拟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)

编程实现LINUX下目录的层层遍历

/************************************************************************* > File Name: treedir.c > Author: KrisChou > Mail:[email protected] > Created Time: Tue 19 Aug 2014 05:04:50 PM CST *****************************************************

编程实现linux下的shell

/************************************************************************* > File Name: Kris_shell.c > Author: KrisChou > Mail:[email protected] > Created Time: Thu 21 Aug 2014 04:31:55 PM CST **************************************************

Linux下的 ls 命令的简单实现

又到了期末的时候,Linux实践课的老师挺厚道,布置了算是一个入门的大作业:实现一个简单版本的ls命令.三个文件,先上传再说. ls2.c #include <stdio.h> #include "ls_header.h" int main(int argc, char **argv) { // 处理参数, lsLong是带有 -l 参数的, lsShort为没有-l参数的ls命令 int i; if (argc == 1) { /* ls . */ lsShort(&qu

Linux下的ls 常用命令

ls是linux下最常用的命令之一.下面列出常用的几个命令 ls  :展示当前目录下所有非隐藏的文件. ls -a :列出目录下的所有文件,包含以.开头的隐含文件. ls -l :列出文件的详细信息. ls -s :在每个文件名后输出该文件的大小 ls -r : 对目录方向排序 ls -t : 以时间排序 ls -u : 以文件上次被访问的时间排序 ls -S : 以文件大小排序 ls -X :以文件的扩展名(最后一个.后的字符)排序 ls -1 : 一行只显示一个文件 ls --help:在标

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

需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有: #include <dirent.h> DIR* opendir(const char* dir_path); struct dirent* readdir(DIR* dirp); int closedir(DIR* dirp); int lstat(const chat* filename,struct stat* st); 在这里涉及到几个结构体:DIR,struct dirent,struct st

Linux下的fdlisk - l 用法解析-入门篇

fdlisk - l 的含义是查看linux下面的磁盘分区大小.这个大小包含了很多信息. 我们来看度娘的一则介绍: FDISK进行硬盘分区从实质上说就是对硬盘的一种格式化.当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即MasterBootRecord,MBR)和引导记录备份的存放位置.而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过之后的高级格式化,即Format命令来实现.用一个形象的比喻,分区就好比在一张白纸上画一个大方框.而格式化好比在方框里打上格子