UNIX环境高级编程学习之第六章系统数据文件和信息-修改第四章实现的Shell的“ls -l”功能, 加入显示文件的用户名和组名
[code lang="cpp"]// 只能查看目录中的所有文件属性
#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;
}
[/code]
文章评论