客户端与服务器通信项目6:C语言实现Linux下的ls-l命令

13、实现Linux下的ls-l命令

/*
*获取模式类型,并转换成字符
*/
void getmode(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';
	}
}

/*
*获取文件所有者
*/
char* uid_to_name(uid_t uid)
{
	struct passwd* getpwuid(), *pw_ptr;
	static char numstr[10];
	//若没有对应的用户名,则将uid存入numstr
	if((pw_ptr = getpwuid(uid)) == NULL)
	{
		sprintf(numstr, "%d", uid);
		return numstr;
	}
	else
	{
		return pw_ptr->pw_name;
	}
}

/*
*获取文件所有者对应组
*/
char* gid_to_name(gid_t gid)
{
	struct group* getpwuid(), *pw_ptr;
	static char numstr[10];
	//若没有对应的用户名,则将uid存入numstr
	if((grp_ptr = getpwuid(uid)) == NULL)
	{
		sprintf(numstr, "%d", gid);
		return numstr;
	}
	else
	{
		return grp_ptr->gr_name;
	}
}

/*
*读取文件属性并存入buf缓存区
*/
void show_file_info(char* filename, struct stat* info_p)
{
	char* ctime();
	char m_mode[11] = {0};
	char filestat[256] = {0};

	//获取模式类型,并转换成字符
	getmode(info_p->st_mode, m_mode);
	//.12指取前面12位,+4指从第5位开始读取,即从第5位开始,显示12位字符
	sprintf(filestat, "%s %3d %8s %8s %10ld %.12s %s\n,
			m_mode, (int)info_p->st_nlink, uid_to_name(info_o->st_uid), gid_to_name(info_p->st_gid),
			(long) info_p->st_size, 4+ctime(&info_p->st_mtime), filename);
	strcat(buf, filestat);
}

/*
*根据文件名获取文件属性结构体
*/
void dostat(char* filename)
{
	//存放文件信息的结构体
	struct stat m_stat;
	if(stat(filename, &m_stat) == -1)
	{
		perror(filename);
	}
	else
	{
		show_file_info(filename, &m_stat);
	}
}

/*
*根据目录名获取该目录下的文件名
*/
char* ls_function(char *dirname)
{
	//创建目录指针
	DIR* dir_ptr;
	//存放目录信息的结构体
	struct dirent* direntp;
	memset(buf, 0, BUFFER_SIZE);
	//打开一个目录,失败时返回空指针
	if(dir_ptr = opendir(dirname)) == NULL)
	{
		perror("opendir");
	}
	else
	{
		/*读目录,一次返回目录的子项
		*一次返回一个,读一个目录指针后移一次
		*到目录尾或出错时返回NULL,出错会设置errno
		*/
		while((direntp = readdir(dir_ptr)) != NULL)
		{
			//若目录下文件不为空,逐个读取文件信息
			dostat(direntp->d_name);
		}
		//关闭文件目录
		closedir(dir_ptr);
	}
	return buf;
}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值