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

📄 lscommand.c

📁 3.编程实现在linux中ls -l -a 命令。用c重新实现类似ls -l -a 命令
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include<pwd.h>
#include<grp.h>
void do_ls(char* str);
void printstat(char *strname);
void showfileinfo(char* strname,struct stat *infop);
char* uidtoname(uid_t uid);
char* gidtoname(gid_t gid);
void modetostr(int mode,char* str);
int main(int argc,char*argv[])
{
	if(argc==1)
	{
		do_ls(".");
	}
	else
		while(--argc)
	{
		printf("%s:\n",*++argv);
		do_ls(*argv);
	}
	return 0;

}
void do_ls(char* strname)
{
	DIR *dir_ptr;
	struct dirent *direntp;
	if((dir_ptr=opendir(strname))==NULL)
	{
		fprintf(stderr,"can not open %s \n",strname);

	}
	else
	{
		while((direntp=readdir(dir_ptr))!=NULL)
		{
			printstat(direntp->d_name);
		}
		closedir(dir_ptr);
	}
}
void printstat(char *strname)
{
	struct stat info;
	if(stat(strname,&info)==-1)
	{
		perror(strname);
	}
	else
		showfileinfo(strname,&info);
	
}
void showfileinfo(char* strname,struct stat *infop)
{
	char str[10];
	memset(str,0,sizeof(str));
	modetostr(infop->st_mode,str);
	printf("%s",str);
	printf("%4d",(int)infop->st_nlink);
	printf("%-8s",uidtoname(infop->st_uid));
	printf("%-8s",gidtoname(infop->st_gid));
	printf("%8ld",(long)infop->st_size);
	printf("%.12s",4+ctime(&infop->st_mtime));
	printf("%s\n",strname);
}
char* uidtoname(uid_t uid)
{
	struct passwd* getpwuid();
	struct passwd* ptr;
	static char numstr[10];
	if((ptr=getpwuid(uid))==NULL)
	{
		sprintf(numstr,"%d",uid);
		return numstr;
	}
	else
	{
		return ptr->pw_name;
	}
}
char* gidtoname(gid_t gid)
{
	struct group* getgrgid(),*grpptr;
	static char numstr[10];
	if((grpptr=getgrgid(gid))==NULL)
	{
		sprintf(numstr,"%d",gid);
		return numstr;
	}
	else
	{
		return grpptr->gr_name;
	}
}
void  modetostr(int mode,char* str)
{
	strcpy(str,"----------");
	if(S_ISDIR(mode))
		str[0] ='d';
	if(S_ISCHR(mode))
		str[0] ='c';
	if(S_ISBLK(mode))
		str[0] ='b';
	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';
	//return str;
}

⌨️ 快捷键说明

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