UNIX环境高级编程学习之第六章系统数据文件和信息-修改第四章实现的Shell的“ls -l”功能

Linux/Unix C/C++ xiujie 186℃ 0评论 已收录

UNIX环境高级编程学习之第六章系统数据文件和信息-修改第四章实现的Shell的“ls -l”功能, 加入显示文件的用户名和组名

// 只能查看目录中的所有文件属性
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <grp.h>  
#include <pwd.h>
char * gidToGroupName(char *szGroupName, gid_t gid)  
{  
	struct group* gtr;  
	gtr = getgrgid(gid);  
	strcpy(szGroupName, gtr->gr_name);  
	return szGroupName;  
}  
char * uidToUserName(char *szUserName, uid_t uid)
{
	struct passwd *ptr;  
	ptr = getpwuid(uid);  
	strcpy(szUserName, ptr->pw_name);
	return szUserName;  
}
int main(int argc, char *argv[])
{
	char szDirPath[512] = { 0 };
	char szFilePath[512] = { 0 };
	DIR * pDIR;
	if (argc > 1)
	{
		strcpy(szDirPath, argv[1]); // 把命令行第一个参数作为文件夹的路径
	}else {
		strcpy(szDirPath, ".");	
	}
	pDIR = opendir(szDirPath);
	if (NULL == pDIR)
	{
		printf("Open DIR[%s] Error! /n", szDirPath);
		return -1;
	}
	struct dirent* pdirent; // 文件夹下文件信息结构体
	char szName[256]; // 文件名
	char szLineData[512]; // 打印到屏幕上的一行数据
	struct stat file_stat; // 文件属性信息结构体
	while ( (pdirent = readdir(pDIR)) != NULL) // 循环读取文件夹下的一条文件信息
	{
		// 初始化下面用到的字符串
		memset(szName, 0, sizeof(szName));
		memset(szLineData, 0, sizeof(szLineData));
		memset(szFilePath, 0, sizeof(szFilePath));
		memset(&file_stat, '/0', sizeof(file_stat));
		// 取文件名;文件名加上父文件夹路径组成文件路径
		strcpy(szName, pdirent->d_name);
		sprintf(szFilePath, "%s/%s", szDirPath, szName);
		// 取文件属性信息
		stat(szFilePath, &file_stat);
		// 取最后修改时间	
		time_t t =  file_stat.st_mtime;
		// 根据类型给名字后面添加后缀
		int len = strlen(szName);
		if (pdirent->d_type == DT_DIR) // 文件夹
		{
			szName[len] = '//';
		}else if (pdirent->d_type == DT_DIR) // 符号连接
		{
			szName[len] = '@';
		}
		// 取文件所属用户名和组名
		char szUserName[32];
		char szGroupName[32];
		memset(szUserName, '/0', sizeof(szUserName));
		memset(szGroupName, '/0', sizeof(szGroupName));
		uidToUserName(szUserName, file_stat.st_uid);
		gidToGroupName(szGroupName, file_stat.st_gid);
		// sprintf(szLineData, "%-32s uid=%-8u gid=%-8u LastDate=%s ", szName, file_stat.st_uid, file_stat.st_gid, ctime(&t));
		sprintf(szLineData, "%-32s UName=%-16s GName=%-16s LastDate=%s ", szName, szUserName, szGroupName, ctime(&t));
		printf(szLineData);	
	} 
	printf("/n");
	closedir(pDIR);
	return 0;
}

喜欢 (1)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址