版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux-ls命令模拟/ ls.c/ wxd/ create by jneeyou on 15/11/13/ Copyright (c) 2015 wxd. All rights reserved./#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include "ls_fileHandle.h"/*主函数*/int main(int argc, char *argv)int mask = 0;bool ret = false;freopen(".err.dat
2、","wb",stderr);if (!init()return -1;mask = getCmdLineArgs(argc,argv);if (mask = -2)/-help命令getHelpMenu();/显示帮助else if (mask = ERROR)printf("参数有误,输入"./ls -help"查看帮助n");else/其他命令setMaskArray(mask);ret = getDirInfo(".", 0);if (!ret)printf("参数有误,输入"
3、./ls -help"查看帮助n");freeMem();system("rm -f .err.dat");return 0;/ ls_fileHandle.h/ wxd/ create by jneeyou on 15/11/13/ Copyright (c) 2015 wxd. All rights reserved./#ifndef _LS_FILE_HANDLE_H_#define _LS_FILE_HANDLE_H_/定义bool型#if !defined(bool)#define bool char#define true 1#define
4、false 0#endif#ifndef ERROR#define ERROR -1#endif#if defined(_STDC_VERSION_) && (_STDC_VERSION_>=199901L)/desc 宏函数,输出文件信息#define printf_c(fontBgColor,fontColor,format,args.) printf("033fontBgColor;fontColorm format0330m",args)#else/desc 输出文件信息/ 带颜色输出,可设置字体颜色和字体背景颜色extern int prin
5、tf_c(char fontBgColor, char fontColor, const char *format, .);#endif/desc 获取命令行参数,返回掩码值extern int getCmdLineArgs(int argc, char *argv);/desc 设置掩码数组/ret 成功返回true,否则返回falseextern bool setMaskArray(int maskValue);/desc 获得文件信息/ret 成功返回true,否则返回falseextern bool getFileInfo(const char *dirName, const char
6、 *fileName, unsigned int index);/desc 获得目录信息/ret 成功返回true,否则返回falseextern bool getDirInfo(const char *dirName, int dirLevel);/desc 获得帮助菜单extern void getHelpMenu();/desc 释放内存void freeMem();/desc 初始化bool init();#endif / _LS_FILE_HANDLE_H_/ ls_fileHandle.c/ wxd/ create by jneeyou on 15/11/13/ Copyright
7、 (c) 2015 wxd. All rights reserved./#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <stdarg.h>#include <unistd.h>#include <dirent.h>#include <time.h>#include <math.h>#include <pwd.h>#include <grp.h&g
8、t;#include <sys/types.h>#ifndef ERROR#define ERROR -1#endif#define OK 0#define NUL_POINTER NULL/定义bool,true,false#ifndef bool#define bool char#define true 1#define false 0#endif/帮助文件名#define HELP_FILE"helpInfo.dat"#define TMP_FILE".tmp"/定义 errno_t 型#define errno_t int/定义文件类
9、型#define block_file'b'#define direct_file'd'#define spec_char_file 'c'#define fifo_device 'p'#define regular_file'-'#define link_file 'l'#define socket_file 's'#define BF block_file/块文件#define DF direct_file/目录文件#define CF spec_char_file/特殊字符文件
10、#define FD fifo_device/FIFO设备#define RF regular_file/普通文件#define LF link_file/符号链接文件#define SF socket_file/scoket文件/文件名最大长度#define MAX_FILE_NAME512/最多子目录个数#define MAX_SUB_DIR100/背景色typedef struct BG_COLORconst char BLACK;/黑const char DARKRED;/深红const char GREEN;/绿const char YELLOW;/黄const char BLUE;
11、/蓝const char PURPLE;/紫const char DARKGREEN;/深绿const char WHITE;/白const char DEFAULT;/默认 bgColor;/文字背景色static const bgColor font_bgColor = 40, 41, 42, 43, 44, 45, 46, 47, 0 ;/前景色typedef struct FG_COLOR const char BLACK;/黑const char RED;/红const char GREEN ;/绿const char YELLOW ;/黄const char BLUE;/蓝cons
12、t char PURPLE;/紫const char DARKGREEN;/深绿const char WHITE;/白const char DEFAULT;/默认 fgColor;/文字颜色static const fgColor font_fgColor = 30, 31, 32, 33, 34, 35, 36, 37, 0 ;/文件信息结构体typedef struct File_Infoino_t ino;/节点号char type;/类型char perm10;/权限nlink_t nlink;/硬链接数char uname32;/用户名char gname32;/所属组名off_t
13、size;/大小time_t mtime;/最后修改时间char name32;/文件名char lname32; /链接的文件名char nameColor;/名字颜色char lnameColor;/链接文件颜色 fileInfo;#define MAX_FILE_NUM 100/文件信息结构体数组static fileInfo *m_fileInfo = NULL;/已分配空间static unsigned int ALLOC_MEM_LEN = 0;/全局变量/掩码数组,根据每位元素值是否为1选择获取文件哪些/信息,每位元素对应一个ls命令参数,对应关系如下:/ maskArray0-
14、> -l/ maskArray1-> -a/ maskArray2-> -R/ maskArray3-> -r/ maskArray4-> -d/ maskArray5-> -i/ maskArray6-> -S(大写S)/ maskArray7-> -t/ maskArray8-> -m/ maskArray9-> -1(数字1)/ maskArray10-> -help/ maskArray11->无参数/ maskArray12.15-> 保留static unsigned char maskArray16 =
15、 0;/掩码数组有效长度#define VALID_LEN_ARRAY10/保存外部输入的文件名static char fileName12820 = "" ;/外部文件数目static int extFileNums = 0;/- 函数实现-/检查参数errno_t checkArgement(char arg)static const char allArgs = 'l','a','R','r','d','i','S','t','m
16、39;,'1'int len = strlen(allArgs);int i = 0;for (i = 0; i < len; i+)if (arg = allArgsi) return i;return ERROR;/安全拷贝errno_t strcpy_s(char * _Dst, size_t _SizeInBytes, const char * _Src)char *ret = NULL;if (strlen(_Src) > _SizeInBytes)return ERROR;ret= strcpy(_Dst, _Src);if (ret = NULL) r
17、eturn ERROR;return OK;/安全打开errno_t fopen_s(FILE * _File, const char * _Filename, const char * _Mode)*_File = fopen(_Filename, _Mode);if (*_File = NULL) return ERROR;return OK;/安全输出errno_t vsprintf_s(char * _DstBuf, size_t _SizeInBytes, const char * _Format,va_list _ArgList)errno_t ret = vsnprintf(_D
18、stBuf, _SizeInBytes, _Format, _ArgList);return ret;/获取命令行参数,返回掩码值int getCmdLineArgs(int argc, char *argv)int maskValue = 0x0000;int fileCount = 0;int i = 0;for (i = 1; i < argc; i+)if (!strcmp(argvi, "-help")return -2; else if (argvi0 = '-')int len = strlen(argvi);int ret = ERRO
19、R;while (-len)ret = checkArgement(argvilen);if (ret = ERROR) return ERROR;maskValue |= (0x0001 << ret);elsestrcpy_s(fileNamefileCount+, sizeof(fileName0), argvi);extFileNums = fileCount;return maskValue;/设置掩码数组bool setMaskArray(int maskValue)long tmp = 0x10000;int i = 15;memset(maskArray,0,siz
20、eof(maskArray);if (maskValue = 0)maskArray11 = 1;return true;while ( !(tmp >>= 1) & maskValue) && tmp > 0) i-;while (tmp > 0)if (tmp & maskValue)maskArrayi- = 1;elsemaskArrayi- = 0;tmp >>= 1;return true;#if !(defined(_STDC_VERSION_)&& _STDC_VERSION_>=1999
21、01L)/desc 宏函数,带颜色输出,#format,将format对应的参数字符串化(为变量名时,不是变量中的值,而是变量名)#define PRINT_BY_COLOR(fontBgColor,Bold,fontColor,format,argsValue) printf("033%d;%02d;%dm"#format"0330m",fontBgColor,Bold,fontColor,argsValue) /输出文件信息int printf_c(char fontBgColor, char fontColor, const char *forma
22、t, .)static char printf_buf1024;va_list args;int n = 0;int bold = 0;va_start(args, format);n = vsprintf_s(printf_buf, sizeof(printf_buf), format, args);va_end(args);if ( fontBgColor < 40 | fontBgColor > 47 )fontBgColor = font_bgColor.DEFAULT;if ( fontColor < 30 | fontColor > 37 )fontBgCo
23、lor = font_fgColor.DEFAULT;if (fontColor = font_fgColor.BLACK)bold = 0;PRINT_BY_COLOR(fontBgColor, bold, fontColor, "%s", printf_buf);return n;#endif/通过uid获得用户名char * getUnameByUid(uid_t uid)struct passwd *m_pw;static char name20 = ""m_pw = getpwuid(uid);if (m_pw = NULL)return NU
24、L_POINTER;strcpy_s(name, sizeof(name), m_pw->pw_name);return name;/通过gid获得组名char * getGnameByGid(gid_t gid)struct group *m_gr;static char name20 = ""m_gr = getgrgid(gid);if (m_gr = NULL)return NUL_POINTER;strcpy_s(name, sizeof(name), m_gr->gr_name);return name;/ 获取符号链接链接的文件名bool getF
25、ileNameBySLink(char *sLinkName,char *buf, size_t bufSize)int len = 0;len = readlink(sLinkName, buf, bufSize);buflen = '0'if (len > bufSize)perror("文件名过长,已被截取.");return true;/获取文件访问权限char * getFileAccePermis(mode_t st_mode)static char perm9 = ""char permValue4 = "x
26、wr-"int i = 0, len = 9;for (i = 0; i < len; i+)if ( st_mode & (0x1 << i)permlen - i - 1 = permValuei % 3;elsepermlen - i - 1 = permValue3;return perm;/获取文件类型char getFileType(mode_t st_mode)switch (st_mode & S_IFMT) case S_IFBLK: return BF;case S_IFDIR: return DF;case S_IFCHR: r
27、eturn CF;case S_IFIFO: return FD;case S_IFREG: return RF;case S_IFLNK: return LF;case S_IFSOCK: return SF; default: return ERROR;/通过文件类型获得文件名颜色char getFileColorByType(const char *fileName,char type)char cmd3512;char ret = font_fgColor.BLACK;if (type = DF) return font_fgColor.BLUE;if (type = LF) retu
28、rn font_fgColor.DARKGREEN;if (access(fileName, X_OK) = 0) return font_fgColor.GREEN;/测试是否为压缩文件if (!system("mkdir tmp")sprintf(cmd0, "tar -xf %s -C tmp", fileName);sprintf(cmd1, "tar -xzf %s -C tmp", fileName);sprintf(cmd2, "tar -xjf %s -C tmp", fileName);if (!
29、system(cmd0) | !system(cmd1) | !system(cmd2)ret = font_fgColor.RED;system("rm -Rf tmp"); return ret;/获得文件信息bool getFileInfo(const char *dirName, const char *fileName, unsigned int index)struct stat fileStat;char name50;sprintf(name,"%s/%s",dirName,fileName);/数组已装满if (index >=
30、ALLOC_MEM_LEN)m_fileInfo = (fileInfo*)realloc(m_fileInfo, sizeof(fileInfo) * ALLOC_MEM_LEN * 2);ALLOC_MEM_LEN *= 2;/获取文件信息int ret = lstat(name, &fileStat);if (ret = -1)return false;/节点号m_fileInfoindex.ino = fileStat.st_ino;/文件类型m_fileInfoindex.type = getFileType(fileStat.st_mode);/文件权限strcpy_s(m
31、_fileInfoindex.perm, sizeof(m_fileInfoindex.perm), getFileAccePermis(fileStat.st_mode); /硬链接数m_fileInfoindex.nlink = fileStat.st_nlink;/用户名strcpy_s(m_fileInfoindex.uname, sizeof(m_fileInfoindex.uname), getUnameByUid(fileStat.st_uid);/组名strcpy_s(m_fileInfoindex.gname, sizeof(m_fileInfoindex.gname), g
32、etGnameByGid(fileStat.st_gid);/文件大小m_fileInfoindex.size = fileStat.st_size;/上次修改时间m_fileInfoindex.mtime = fileStat.st_mtime;return true;/自定义排序函数int cmp(const void *a, const void *b)char tmpA,tmpB;fileInfo *fileInfoA = (fileInfo *)a;fileInfo *fileInfoB = (fileInfo *)b;if (maskArray7 = 1)return fileIn
33、foA->mtime - fileInfoB->mtime;else if(maskArray6 = 1)return fileInfoA->size - fileInfoB->size;tmpA = fileInfoA->name0;if (tmpA >= 'A' && tmpA <= 'Z')tmpA += 'a' - 'A'tmpB = fileInfoB->name0;if (tmpB >= 'A' && tmpB <
34、;= 'Z')tmpB += 'a' - 'A'if (maskArray3 = 1)return tmpB - tmpA;elsereturn tmpA - tmpB;/文件排序void sortFiles(fileInfo *pFileInfoArray, int elemNum)qsort(pFileInfoArray, elemNum, sizeof(pFileInfoArray0), cmp);/移动输出位置void moveOutPos(int row,int col)char hori ='A'/向上char ver
35、t = 'C'/向右if (row < 0)/向下hori = 'B'row = -row;if (col < 0)/向左vert = 'D'col = -col;printf("033%d%c033%d%c",row, hori, col, vert);/ 通过掩码数组输出文件/ 返回输出内容长度int outFileByMaskArray(fileInfo cur_fileInfo, unsigned char maskArray)int outputFlag = 0;/是否输出标志char outStr102
36、4 = ""/输出字符串int i = 0;int len = 0;/不带参数情况if (maskArray11 = 1)printf_c(font_bgColor.DEFAULT, cur_fileIColor, "%s", cur_fileI);return strlen(cur_fileI);/-l命令,长格式输出if (maskArray0)struct tm *mTime = localtime(&cur_fileInfo.mtime);char str20 = ""s
37、printf(str,"%4d.%02d.%02d %02d:%02d:%02d",mTime->tm_year + 1900,mTime->tm_mon + 1,mTime->tm_mday,mTime->tm_hour,mTime->tm_min,mTime->tm_sec);sprintf(outStr, "%c%s. %d %s %s %-8d %s", cur_fileInfo.type, cur_fileInfo.perm, cur_fileInfo.nlink,cur_fileInfo.uname, cu
38、r_fileInfo.gname, cur_fileInfo.size, str);/-i命令,输出节点号inoif (maskArray5)char tmp512 = ""strcpy_s(tmp, sizeof(tmp),outStr);sprintf(outStr, "%d %s", cur_fileInfo.ino, tmp);len = strlen(outStr);printf("%s", outStr);/输出文件信息if (maskArray0)printf(" ");len += 2;len +=
39、 strlen(cur_fileI);printf_c(font_bgColor.DEFAULT, cur_fileIColor,"%s", cur_fileI);/-l格式下的输出链接文件指向的文件if (maskArray0 && cur_fileInfo.type = LF)printf(" -> ");printf_c(font_bgColor.DEFAULT, cur_fileInfo.lnameColor,"%s", cur_fileInfo.lname
40、);len += strlen(cur_fileInfo.lname) + 4;return len;/获得目录信息bool getDirInfo(const char *dirName, int dirLevel)DIR *curDir = opendir(dirName);char linkedFileMAX_FILE_NAME = ""char subDirFileMAX_SUB_DIRMAX_FILE_NAME;/保存目录文件int cnt_subDir = 0;/子目录数int cnt_dirFiles = 0;/目录下文件数int i = 0, ret = 0;
41、static firCallFlag = 1;/第一次调用标记int total_size = 0;char tmpMAX_FILE_NAME = ""struct stat m_stat;if (curDir = NULL)return false;/-R命令时首先输出目录名if ( maskArray2 )for (i = 0; i < dirLevel; i+) printf("t");printf("%s:n",dirName);struct dirent *m_dirent = NULL;while (m_dirent
42、 = readdir(curDir) != NULL)if (!strcmp(".err.dat", m_dirent->d_name)continue;if (!strcmp(dirName,".") && extFileNums > 0)for ( i = 0; i < extFileNums; i+)if (!strcmp(fileNamei, m_dirent->d_name)break;firCallFlag = 0;if ( i = extFileNums) continue;/非-a命令时跳过隐藏文件
43、if (m_dirent->d_name0 = '.' && maskArray1 != 1)continue;ret = getFileInfo(dirName, m_dirent->d_name, cnt_dirFiles);if (!ret | !strcmp(m_dirent->d_name,"") break;/-d命令跳过非目录文件if (maskArray4 = 1 && m_fileInfocnt_dirFiles.type != DF)continue ;sprintf(tmp, "
44、;%s/%s",dirName,m_dirent->d_name);strcpy_s(m_fileInfocnt_dirF, sizeof(m_fileInfocnt_dirF), m_dirent->d_name);m_fileInfocnt_dirFColor = getFileColorByType(tmp, m_fileInfocnt_dirFiles.type);/获得链接的目标文件名if (m_fileInfocnt_dirFiles.type = LF)getFileNameBySLink(tmp, li
45、nkedFile, sizeof(linkedFile);strcpy_s(m_fileInfocnt_dirFiles.lname, sizeof(m_fileInfocnt_dirFiles.lname), linkedFile);lstat(linkedFile, &m_stat);sprintf(tmp, "%s/%s",dirName,linkedFile);m_fileInfocnt_dirFiles.lnameColor = getFileColorByType(tmp,getFileType(m_stat.st_mode);/-R命令时保存子目录if
46、 (maskArray2 && m_fileInfocnt_dirFiles.type = DF)strcpy_s(subDirFilecnt_subDir, sizeof(subDirFilecnt_subDir), m_fileInfocnt_dirF); cnt_subDir+;total_size += m_fileInfocnt_dirFiles.size;cnt_dirFiles+;firCallFlag = 1;if (firCallFlag = 0)return false;/排序输出文件sortFiles(m_fileInfo, cnt_di
47、rFiles);/输出文件int col = 4, row ;int max_lenRowOfCol = 0;/当前列最长行长度int total_lenRow = 0;/当前行总长度int len = 0, firColFlag = 0;int j = 0;row = cnt_dirFiles / col;row = (cnt_dirFiles * 1.0 / col > row) ? row + 1 : row;if (maskArray0 = 1)if ( maskArray2 )for (j = 0; j < dirLevel; j+) printf("t");printf("file number:%d total size:%dn",cnt_dirFiles, total_size);for (i = 1; i <= cnt_dirFiles; i+)if (maskArray2 && (i <= row | maskArray0 | maskArray9)for (j = 0; j < dirL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 双方共同承建协议书
- 午休托管班合同范本
- 叫转让产品合同范本
- 叫协议过户房子合同
- 合伙酒店出资协议书
- 司机合作送货协议书
- 商品供应协议书范本
- 协会活动赞助协议书
- 老房子装修拆除合同
- 基于BIM的建筑施工现场信息追溯系统方案
- 测井解释与生产测井-吴锡令生产测井原理与应用
- 去极端化思想课件
- 2023年马克思主义基本原理概论课程基础知识点集萃
- GB/T 23723.3-2010起重机安全使用第3部分:塔式起重机
- 0-6岁儿童健康管理规范
- MBA-营销管理复习题精华及答案
- 高二(8)艺术班下学期家长会课件
- 脾胃风湿病科护理组卧床患者便秘的健康教育知晓率
- 腰骶疼痛精确诊断治疗课件
- 气相色谱质谱联用仪操作规程精
- ceco61112122tba1触摸版万能蒸烤箱说明书
评论
0/150
提交评论