unix环境编程---简单模拟 ls -l

这个博客很久没有管过了,今天学了一点unix环境编程,模拟了一个简单的ls -l 命令,从两点多一直写到现在,各种翻书,各种百度,总算是基本上完成了这一伟大的ls命令的阉割版,别的不多说了,脑袋都晕了,直接上代码(虽然代码写的很烂,大牛勿喷),不过注释什么的我觉得应该写的够详细了吧,希望大家能指出各种毛病,大牛能给出些建议


#include<stdio.h>
#include<sys/stat.h>//lstat
#include<time.h>//gmtime
#include<unistd.h>
#include<string.h>//strcmp
#include<error.h> //errno
#include<pwd.h>//getpwuid
#include<grp.h>//getgrgid
#include <dirent.h>//opendir/readdir/closedir
#include <sys/types.h>
void file_type(const struct stat *s)//显示文件类型
{
	if(S_ISDIR(s->st_mode))//判断是否为文件夹
	{
		printf("d");
	}
	else if(S_ISREG(s->st_mode))//判断是否为普通文件
	{
		printf("-");
	}
	else
	{
		printf("其他");
	}
}

void file_mode(const struct stat *s)//显示文件权限
{
	unsigned short int a=0x0100;
	int i=0;
	for(i=0;i<9;i++)
	{
		if(i%3==0)
		{
			if(s->st_mode & a)//判断是否可读
			{
				printf("r");
			}
			else
			{
				printf("-");
			}
			a>>=1;
		}
		else if(i%3==1)//判断是否可写
		{
			if(s->st_mode & a)
			{
				printf("w");
			}
			else
			{
				printf("-");
			}
			a>>=1;	
		}
		else//判断是否可执行
		{
			if(s->st_mode & a)
			{
				printf("x");
			}
			else
			{
				printf("-");
			}
			a>>=1;
		}	
	}		
}



void file_show(const struct stat *s,const char *file_name)//显示文件/文件夹信息操作
{
	file_type(s);//显示文件类型
	file_mode(s);//显示文件权限
	printf("\t");
	printf("%d",s->st_nlink);//显示文件硬链接/目录子目录数
	printf("\t");
	printf("%s",getpwuid(s->st_uid)->pw_name);//显示文件拥有者
	printf("\t");
	printf("%s",getgrgid(s->st_gid)->gr_name);//文件拥有者所在组
	printf("\t");
	printf("%ld",s->st_size);//显示文件大小
	printf("\t");
	struct tm *t = localtime(&s->st_mtime);//获取最后修改时间
	printf("%d月 %d %02d:%02d",t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);//显示最后修改时间
	printf(" ");
	printf("%s",file_name);
	//printf("%o",s->st_mode);
	printf("\n");
}

void dir_file(const struct stat *s,const char *file_name)//目录文件操作
{
	DIR *d;
	unsigned long int size= 0;
	d = opendir(file_name);//打开目录
	if(d)
	{
		struct dirent* p;
		while(p=readdir(d))//读取目录中的文件和目录
		{
			if(p->d_name[0]=='.') {
			continue;//跳过隐藏文件
			}
			char path[300] = "";
			sprintf(path,"%s/%s",file_name,p->d_name);//获得相对路径
			struct stat w;
			lstat(path,&w);//获得文件信息
			file_show(&w,p->d_name);
			size+=w.st_size;			
		}
		closedir(d);//关闭目录
		printf("总用量 %ld\n",size);//文件夹用量
	}
	else
	{
		printf("%m");//打印错误信息
	}
}




int main(int argc,char* argv[])
{
	if(argc<3)//判断参数数量是否正确
	{
		puts("您的输入参数过少\n");	
		return -1;
	}
	if(strcmp(argv[1],"-l"))//判断参数是否正确
	{
		puts("您输入的参数有误");
		return -2;
	}
	struct stat s;//定义一个接收文件信息的结构体
	if(!lstat(argv[2],&s))//读取文件信息,判断是否读取成功
	{
		//printf("%s\n",s.st_mode);
		if(S_ISDIR(s.st_mode))//判断是否为文件夹
		{
			printf("%s 是目录\n",argv[2]);
			dir_file(&s,argv[2]);
		}
		else if(S_ISREG(s.st_mode))//判断是否为文件
		{
			printf("%s 是一般文件\n",argv[2]);
			file_show(&s,argv[2]);//显示文件信息
		}
		else
		{
			puts("其他文件");
		}
	}
	else
	{
		printf("%m");//打印错误信息
	}
	return 0;
}



你可能感兴趣的:(unix环境编程---简单模拟 ls -l)