首页 > 代码库 > 编程实现Linux下的ls -l
编程实现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 256int 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 ; 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: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 := ./srcINC_DIR := ./includeEXE_DIR := ./binOBJECTS := $(wildcard $(SRC_DIR)/*.c)INCLUDES :=$(wildcard $(INC_DIR)/*.h)CC := gccFLAGS := -o$(EXE_DIR)/main : $(OBJECTS) $(INCLUDES) $(CC) $(FLAGS) $@ $(OBJECTS) -I$(INC_DIR)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。