⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hls.c

📁 自己写的ls命令
💻 C
字号:
//实现功能 1. ls	  2. ls -l	 3.  ls -l [若干目录或文件名]	 4. ls [若干目录或文件名]#include <stdio.h>#include <sys/types.h>#include <dirent.h>#include <sys/stat.h>#include<pwd.h>#include <grp.h>void ls_output(char dirname[],int flag);void file_permission(int mode,char str[]);char *uid_to_name(uid_t uid);char *gid_to_name(gid_t gid);void show_info(char *filename,struct stat *ptr);void do_stat(char *filename,int flag);void c_show_info(char *filename);char *robchar(char *filename);void c_rob_show_info(char *filename);char file_type(struct stat buf);char *count_file_name(char *filename,int count);main(int argc,char *argv[]){       char cwd[1024];	getcwd(cwd,1024);	int flag;  	char temp;		if(argc==1)   /* ls  */	{		flag=0;		ls_output(cwd,flag);		printf("\n");		//printf("0 none -l output\n");	}	else if (argc==2 && (temp=getopt(argc,argv,"l"))!=-1)  /* ls -l */	{		switch(temp)			case 'l':				{					flag=1;					ls_output(cwd,flag);					printf("\n");					//printf("1 -l output\n");				}	}	else if (argc>2 && (temp=getopt(argc,argv,"l"))!=-1)    /* ls -l [若干目录或文件名]*/		{			flag=2;			--argc;			++argv;			while(--argc)	  				{										++argv;						printf("%s:\n",*argv);						ls_output(*argv,flag);								printf("\n");	  				}			printf("\n");			//printf("2 -l output\n");		}	else                         /* ls [若干目录或文件名]*/		{			flag=3;			while(--argc)	  		{	  			++argv;				printf("%s:\n",*argv);					ls_output(*argv,flag);				printf("\n");	  		}			printf("\n");			//printf("3 non-l output\n");		}		}void ls_output(char dirname[],int flag){	//printf("filename:%s",dirname);	DIR *dir;	struct dirent *p_dirent;	char tempname[1000];	struct stat buf;	if(lstat(dirname,&buf)==-1)		perror(dirname);	else	{		//if (file_type(buf)!='d') do_stat(dirname,flag);		if (file_type(buf)=='-') do_stat(dirname,flag);		else if (file_type(buf)!='-' && (dir=opendir(dirname))==NULL)			fprintf(stderr,"hls: %s: No such file or directory \n",dirname);		else		{			while((p_dirent=readdir(dir))!=NULL)			{				if(p_dirent->d_name[0]=='.') continue;				switch (flag)				{					case 0:					case 1:						do_stat(p_dirent->d_name,flag);						break;					case 2:					case 3:						strcpy(tempname,dirname);						strcat(tempname,"/");						strcat(tempname,p_dirent->d_name);						//printf("%s\n",tempname);						do_stat(tempname,flag);						break;									}						}						closedir(dir);		}	}}/* 文件类型和权限 */void file_permission(int mode,char str[]){	strcpy(str,"----------");	if(S_ISREG(mode)) str[0]='-';	if(S_ISDIR(mode)) str[0]='d';	if(S_ISCHR(mode)) str[0]='c';	if(S_ISBLK(mode)) str[0]='b';	if( S_ISLNK(mode) ) str[0] = 'l';		if(mode & S_IRUSR) str[1]='r';	if(mode & S_IWUSR) str[2]='w';	if(mode & S_IXUSR) str[3]='x';		if(mode & S_IRGRP) str[4]='r';	if(mode & S_IWGRP) str[5]='w';	if(mode & S_IXGRP) str[6]='x';		if(mode & S_IROTH) str[7]='r';	if(mode & S_IWOTH) str[8]='w';	if(mode & S_IXOTH) str[9]='x';	}char *uid_to_name(uid_t uid){	struct passwd *ptr;	ptr=getpwuid(uid);	return ptr->pw_name;}char *gid_to_name(gid_t gid){	struct group *ptr;	ptr=getgrgid(gid);	return ptr->gr_name;}void l_show_info(char *filename,struct stat *ptr){	char modestr[11];	file_permission(ptr->st_mode,modestr);	printf("%s",modestr);	printf("%4d  ",(int)ptr->st_nlink);	printf("%-8s  ",uid_to_name(ptr->st_uid));	printf("%-8s  ",gid_to_name(ptr->st_gid));	printf("%8ld  ",(long)ptr->st_size);	printf("%.12s  ",4+ctime(&ptr->st_mtime));	printf("%s\n",filename);}/* 删除字符串中的'/' */char *robchar(char *filename){	char *p=filename;	while(*p!='/' && *p!='\0')		p++;	if (*p=='/') return p+1;	else return filename;}void c_show_info(char *filename){	char *tmp;	tmp=robchar(filename);	printf("%s   ",tmp );}void c_rob_show_info(char *filename){	printf("%s\n",filename);}void do_stat(char *filename,int flag){	struct stat buf;	char ftype;	int rl;//	char lname[128];	char *truelname;//       char *p=NULL,*q=NULL;	if(lstat(filename,&buf)==-1)		perror(filename);	else	{		ftype=file_type(buf);		switch (flag)		{			case 0:				c_rob_show_info(filename);break;			case 3:				c_show_info(filename);break;			case 1:				l_show_info(filename,&buf);break;			case 2:				if (ftype=='l') 				{					rl=readlink(filename,lname,128);										//readlink(filename,lname,128);					truelname=count_file_name(lname,rl);					p=robchar(filename);					strcat(p,"->");					strcat(p,truelname);					//strcat(p,lname);					l_show_info(p,&buf);break;				}				else 					{						p=robchar(filename);						l_show_info(p,&buf);break;					}		}		}}/*文件类型*/char file_type(struct stat buf){	char ftype;	if( S_ISREG(buf.st_mode) ) ftype = '-';	if( S_ISDIR(buf.st_mode) ) ftype = 'd';	//if(S_ISCHR(buf.st_mode)) ftype='c';	if( S_ISLNK(buf.st_mode) ) ftype = 'l';	return ftype;}/* 截取readlink函数返回字符串中的有效部分 */char *count_file_name(char *filename,int count){	char *p=filename;	char *q=filename;	int i=0;	while(i++<count)		p++;	*p='\0';	return q;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -