Linuxls命令ls命令模拟.docx
- 文档编号:29056950
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:38
- 大小:38.02KB
Linuxls命令ls命令模拟.docx
《Linuxls命令ls命令模拟.docx》由会员分享,可在线阅读,更多相关《Linuxls命令ls命令模拟.docx(38页珍藏版)》请在冰豆网上搜索。
Linuxls命令ls命令模拟
Linux-ls命令模拟
//
//ls.c
//wxd
//
//createbyjneeyouon15/11/13
//Copyright(c)2015wxd.Allrightsreserved.
//
#include
#include
#include
#include"ls_fileHandle.h"
/**主函数**/
intmain(intargc,char*argv[])
{
intmask=0;
boolret=false;
freopen(".err.dat","wb",stderr);
if(!
init())
{
return-1;
}
mask=getCmdLineArgs(argc,argv);
if(mask==-2)//--help命令
{
getHelpMenu();//显示帮助
}
elseif(mask==ERROR)
{
printf("参数有误,输入\"./ls--help\"查看帮助\n");
}
else//其他命令
{
setMaskArray(mask);
ret=getDirInfo(".",0);
if(!
ret)
{
printf("参数有误,输入\"./ls--help\"查看帮助\n");
}
freeMem();
}
system("rm-f.err.dat");
return0;
}
//
//ls_fileHandle.h
//wxd
//
//createbyjneeyouon15/11/13
//Copyright(c)2015wxd.Allrightsreserved.
//
#ifndef__LS_FILE_HANDLE_H__
#define__LS_FILE_HANDLE_H__
//定义bool型
#if!
defined(bool)
#defineboolchar
#definetrue1
#definefalse0
#endif
#ifndefERROR
#defineERROR-1
#endif
#ifdefined(__STDC__VERSION__)&&(__STDC__VERSION__>=199901L)
//@desc宏函数,输出文件信息
#defineprintf_c(fontBgColor,fontColor,format,args...)printf("\033[fontBgColor;fontColormformat\033[0m",args)
#else
//@desc输出文件信息
//带颜色输出,可设置字体颜色和字体背景颜色
externintprintf_c(charfontBgColor,charfontColor,constchar*format,...);
#endif
//@desc获取命令行参数,返回掩码值
externintgetCmdLineArgs(intargc,char*argv[]);
//@desc设置掩码数组
//@ret成功返回true,否则返回false
externboolsetMaskArray(intmaskValue);
//@desc获得文件信息
//@ret成功返回true,否则返回false
externboolgetFileInfo(constchar*dirName,constchar*fileName,unsignedintindex);
//@desc获得目录信息
//@ret成功返回true,否则返回false
externboolgetDirInfo(constchar*dirName,intdirLevel);
//@desc获得帮助菜单
externvoidgetHelpMenu();
//@desc释放内存
voidfreeMem();
//@desc初始化
boolinit();
#endif//__LS_FILE_HANDLE_H__
//
//ls_fileHandle.c
//wxd
//
//createbyjneeyouon15/11/13
//Copyright(c)2015wxd.Allrightsreserved.
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifndefERROR
#defineERROR-1
#endif
#defineOK0
#defineNUL_POINTERNULL
//定义bool,true,false
#ifndefbool
#defineboolchar
#definetrue1
#definefalse0
#endif
//帮助文件名
#defineHELP_FILE"helpInfo.dat"
#defineTMP_FILE".tmp~"
//定义errno_t型
#defineerrno_tint
//定义文件类型
#defineblock_file'b'
#definedirect_file'd'
#definespec_char_file'c'
#definefifo_device'p'
#defineregular_file'-'
#definelink_file'l'
#definesocket_file's'
#defineBFblock_file//块文件
#defineDFdirect_file//目录文件
#defineCFspec_char_file//特殊字符文件
#defineFDfifo_device//FIFO设备
#defineRFregular_file//普通文件
#defineLFlink_file//符号链接文件
#defineSFsocket_file//scoket文件
//文件名最大长度
#defineMAX_FILE_NAME512
//最多子目录个数
#defineMAX_SUB_DIR100
//背景色
typedefstructBG_COLOR
{
constcharBLACK;//黑
constcharDARKRED;//深红
constcharGREEN;//绿
constcharYELLOW;//黄
constcharBLUE;//蓝
constcharPURPLE;//紫
constcharDARKGREEN;//深绿
constcharWHITE;//白
constcharDEFAULT;//默认
}bgColor;
//文字背景色
staticconstbgColorfont_bgColor={40,41,42,43,44,45,46,47,0};
//前景色
typedefstructFG_COLOR
{
constcharBLACK;//黑
constcharRED;//红
constcharGREEN;//绿
constcharYELLOW;//黄
constcharBLUE;//蓝
constcharPURPLE;//紫
constcharDARKGREEN;//深绿
constcharWHITE;//白
constcharDEFAULT;//默认
}fgColor;
//文字颜色
staticconstfgColorfont_fgColor={30,31,32,33,34,35,36,37,0};
//文件信息结构体
typedefstructFile_Info
{
ino_tino;//节点号
chartype;//类型
charperm[10];//权限
nlink_tnlink;//硬链接数
charuname[32];//用户名
chargname[32];//所属组名
off_tsize;//大小
time_tmtime;//最后修改时间
charname[32];//文件名
charlname[32];//链接的文件名
charnameColor;//名字颜色
charlnameColor;//链接文件颜色
}fileInfo;
#defineMAX_FILE_NUM100
//文件信息结构体数组
staticfileInfo*m_fileInfo=NULL;
//已分配空间
staticunsignedintALLOC_MEM_LEN=0;
/////////////////////////////////////全局变量///////////////////////////////////////////////
//掩码数组,根据每位元素值是否为1选择获取文件哪些
//信息,每位元素对应一个ls命令参数,对应关系如下:
//maskArray[0]-->-l
//maskArray[1]-->-a
//maskArray[2]-->-R
//maskArray[3]-->-r
//maskArray[4]-->-d
//maskArray[5]-->-i
//maskArray[6]-->-S(大写S)
//maskArray[7]-->-t
//maskArray[8]-->-m
//maskArray[9]-->-1(数字1)
//maskArray[10]-->--help
//maskArray[11]-->无参数
//maskArray[12...15]-->保留
staticunsignedcharmaskArray[16]={0};
//掩码数组有效长度
#defineVALID_LEN_ARRAY10
//保存外部输入的文件名
staticcharfileName[128][20]={""};
//外部文件数目
staticintextFileNums=0;
//////////////////////////////////////////////////////////////////////////////////////////////
/////////------------------------------------函数实现---------------------------------////////
/////////////////////////////////////////////////////////////////////////////////////////////
//检查参数
errno_tcheckArgement(chararg)
{
staticconstcharallArgs[]={'l','a','R','r','d','i','S','t','m','1'};
intlen=strlen(allArgs);
inti=0;
for(i=0;i { if(arg==allArgs[i])returni; } returnERROR; } //安全拷贝 errno_tstrcpy_s(char*_Dst,size_t_SizeInBytes,constchar*_Src) { char*ret=NULL; if(strlen(_Src)>_SizeInBytes) { returnERROR; } ret=strcpy(_Dst,_Src); if(ret==NULL)returnERROR; returnOK; } //安全打开 errno_tfopen_s(FILE**_File,constchar*_Filename,constchar*_Mode) { *_File=fopen(_Filename,_Mode); if(*_File==NULL)returnERROR; returnOK; } //安全输出 errno_tvsprintf_s(char*_DstBuf,size_t_SizeInBytes,constchar*_Format,va_list_ArgList) { errno_tret=vsnprintf(_DstBuf,_SizeInBytes,_Format,_ArgList); returnret; } //获取命令行参数,返回掩码值 intgetCmdLineArgs(intargc,char*argv[]) { intmaskValue=0x0000; intfileCount=0; inti=0; for(i=1;i { if(! strcmp(argv[i],"--help")) { return-2; } elseif(argv[i][0]=='-') { intlen=strlen(argv[i]); intret=ERROR; while(--len) { ret=checkArgement(argv[i][len]); if(ret==ERROR)returnERROR; maskValue|=(0x0001< } } else { strcpy_s(fileName[fileCount++],sizeof(fileName[0]),argv[i]); } } extFileNums=fileCount; returnmaskValue; } //设置掩码数组 boolsetMaskArray(intmaskValue) { longtmp=0x10000; inti=15; memset(maskArray,0,sizeof(maskArray)); if(maskValue==0) { maskArray[11]=1; returntrue; } while(! ((tmp>>=1)&maskValue)&&tmp>0)i--; while(tmp>0) { if(tmp&maskValue) { maskArray[i--]=1; } else { maskArray[i--]=0; } tmp>>=1; } returntrue; } #if! (defined(__STDC__VERSION__)&&__STDC__VERSION__>=199901L) //@desc宏函数,带颜色输出,#format,将format对应的参数字符串化(为变量名时,不是变量中的值,而是变量名) #definePRINT_BY_COLOR(fontBgColor,Bold,fontColor,format,argsValue)printf("\033[%d;%02d;%dm"#format"\033[0m",fontBgColor,Bold,fontColor,argsValue) //输出文件信息 intprintf_c(charfontBgColor,charfontColor,constchar*format,...) { staticcharprintf_buf[1024]; va_listargs; intn=0; intbold=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) { fontBgColor=font_fgColor.DEFAULT; } if(fontColor==font_fgColor.BLACK) { bold=0; } PRINT_BY_COLOR(fontBgColor,bold,fontColor,"%s",printf_buf); returnn; } #endif //通过uid获得用户名 char*getUnameByUid(uid_tuid) { structpasswd*m_pw; staticcharname[20]=""; m_pw=getpwuid(uid); if(m_pw==NULL) { returnNUL_POINTER; } strcpy_s(name,sizeof(name),m_pw->pw_name); returnname; } //通过gid获得组名 char*getGnameByGid(gid_tgid) { structgroup*m_gr; staticcharname[20]=""; m_gr=getgrgid(gid); if(m_gr==NULL) { returnNUL_POINTER; } strcpy_s(name,sizeof(name),m_gr->gr_name); returnname; } //获取符号链接链接的文件名 boolgetFileNameBySLink(char*sLinkName,char*buf,size_tbufSize) { intlen=0; len=readlink(sLinkName,buf,bufSize); buf[len]='\0'; if(len>bufSize) { perror("文件名过长,已被截取."); } returntrue; } //获取文件访问权限 char*getFileAccePermis(mode_tst_mode) { staticcharperm[9]=""; charpermValue[4]="xwr-"; inti=0,len=9; for(i=0;i { if(st_mode&(0x1< { perm[len-i-1]=permValue[i%3]; } else { perm[len-i-1]=permValue[3]; } } returnperm; } //获取文件类型 chargetFileType(mode_tst_mode) { switch(st_mode&S_IFMT) { caseS_IFBLK: returnBF; caseS_IFDIR: returnDF; caseS_IFCHR: returnCF; caseS_IFIFO: returnFD; caseS_IFREG: returnRF; caseS_IFLNK: returnLF; caseS_IFSOCK: returnSF; default: returnERROR; } } //通过文件类型获得文件名颜色 chargetFileColorByType(constchar*fileName,chartype) { charcmd[3][512]; charret=font_fgColor.BLACK; if(type==DF)returnfont_fgColor.BLUE; if(type==LF)returnfont_fgColor.DARKGREEN; if(access(fileName,X_OK)==0)returnfont_fgColor.GREEN; //测试是否为压缩文件 if(! system("mkdirtmp~")) { sprintf(cmd[0],"tar-xf%s-Ctmp~",fileName); sprintf(cmd[1],"tar-xzf%s-Ctmp~",fileName); sprintf(cmd[2],"tar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linuxls 命令 ls 模拟
![提示](https://static.bdocx.com/images/bang_tan.gif)