肥貓學習日記-------------實現Linux ls -l命令

Linux終端中ls -l是用來查看當前文件夾下所有文件的屬性
下面爲通過main函數的參數實現ls-l命令

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>

void show_name(char* name,char* info)//給文件名字添加顏色
{
	printf("%s",info);
	if('d' == info[0])
	{
		printf("\33[1;34m %s\n\033[0m",name);
	}
	else if('x' == info[3])
	{
		printf("\33[1;32m %s\n\033[0m",name);
	}
	else
	{
		printf(" %s\n",name);
	}
}

char* file_time(time_t t,char* str)//顯示時間
{
	struct tm* it = localtime(&t);
	sprintf(str,"%s %2d月 %02d %02d:%02d",str,it->tm_mon+1,it->tm_mday,it->tm_hour,it->tm_min);
	return str;
}

char* id_to_user(uid_t uid,char* str)//顯示組名
{
	struct passwd* pd = getpwuid(uid);
	sprintf(str,"%s %s",str,pd->pw_name);
	return str;
}

char* id_to_group(gid_t gid,char* str)//顯示用戶名
{
	struct group* gp = getgrgid(gid);
	sprintf(str,"%s %s",str,gp->gr_name);
	return str;
}

char* dir_cnt(char* name,char* str)
{
	int cnt = 1;
	if('d' == str[0])
	{
		cnt = 0;
		char arr[255] = {};
		DIR* dp = opendir(name);
		if(NULL == dp)
		{
			perror("opendir");
			return str;
		}
		for(struct dirent* de=readdir(dp); NULL!=de;
			de=readdir(dp))
		{
			if(DT_DIR==de->d_type) cnt++;
		}
	}
	
	sprintf(str,"%s %d",str,cnt);
	return str;
}

char* file_mode(mode_t m,char* str)//顯示文件屬性
{
	if(S_ISREG(m))
		str[0] = '-';
	else if(S_ISDIR(m))
		str[0] = 'd';
	else if(S_ISCHR(m))
		str[0] = 'c';
	else if(S_ISBLK(m))
		str[0] = 'b';
	else if(S_ISFIFO(m))
		str[0] = 'q';
	else if(S_ISLNK(m))
		str[0] = 'l';
	else if(S_ISSOCK(m))
		str[0] = 's';
	else 
		str[0] = '?';

	str[1] = '\0';

	strcat(str,S_IRUSR&m?"r":"-");
	strcat(str,S_IWUSR&m?"w":"-");
	strcat(str,S_IXUSR&m?"x":"-");

	strcat(str,S_IRGRP&m?"r":"-");
	strcat(str,S_IWGRP&m?"w":"-");
	strcat(str,S_IXGRP&m?"x":"-");
	
	strcat(str,S_IROTH&m?"r":"-");
	strcat(str,S_IWOTH&m?"w":"-");
	strcat(str,S_IXOTH&m?"x":"-");

	return str;
}

void list_file(const char* path)
{
	DIR* dp = opendir(path);
	if(NULL == dp)
	{
		perror("opendir");
		return;
	}

	char info[80] = {};
	for(struct dirent* de=readdir(dp); NULL!=de;
		de=readdir(dp))
	{
		if('.' == de->d_name[0]) continue;
		
		struct stat buf = {};
		if(stat(de->d_name,&buf))
		{
			perror("stat");
			return;
		}
		
		file_mode(buf.st_mode,info);
		dir_cnt(de->d_name,info);
		id_to_user(buf.st_uid,info);
		id_to_group(buf.st_gid,info);
		sprintf(info,"%s %5lu",info,buf.st_size);
		file_time(buf.st_mtime,info);
		show_name(de->d_name,info);
	}
}

int main(int argc,char* argv[])
{
	if(argc == 2)
	{
		if(0 == strcmp("-l",argv[1]))
			list_file(".");			
	}
	else if(argc == 3)
	{
		if(0 == strcmp("-l",argv[1]))
			list_file(argv[2]);			
	}
	else
	{
		printf("User:ls -l xxx\n");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章