Linuxls命令ls命令模拟.docx
《Linuxls命令ls命令模拟.docx》由会员分享,可在线阅读,更多相关《Linuxls命令ls命令模拟.docx(38页珍藏版)》请在冰点文库上搜索。
![Linuxls命令ls命令模拟.docx](https://file1.bingdoc.com/fileroot1/2023-7/17/34a0e052-cd58-4e3e-a42f-2137e5eca83e/34a0e052-cd58-4e3e-a42f-2137e5eca83e1.gif)
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