当前位置:网站首页>IO进程线程->目录IO->day3
IO进程线程->目录IO->day3
2022-07-30 05:46:00 【鲸叫我照顾海QAQ】
目录
作业:
请使用目录相关函数以及文件属性相关函数实现:
显示指定路径下所有文件属性的功能(除了隐藏 文件)。 类似 ls -l 一个目录
一、目录IO函数
1.1 opendir
功能:打开目录;
头文件:
#include <sys/types.h>
#include <dirent.h>
原型:DIR *opendir(const char *name);
参数:
char *name:指定要打开的目录路径以及目录名;
返回值:
成功,返回目录流指针;
失败,返回NULL;
2.2 closedir
2.3 readdir
二、文件所属用户名函数
传入文件所属用户的Linux用户编号,打印出他在系统里的文件所属用户名
//文件所属用户名
int get_uername(uid_t uid)
{
struct passwd* pwd=getpwuid(uid);
if(NULL == pwd)
{
printf("getpwuid failed\n");
return -1;
}
printf("%s\t",pwd->pw_name);
return 0;
}
三、文件所属组用户名函数
传入文件所属组用户的Linux用户编号,打印出他在系统里的文件所属组用户名
//文件所属组用户名
int get_grpnanme(gid_t gid)
{
struct group* grp =getgrgid(gid);
if(NULL == grp)
{
printf("getgrgid failed\n");
return -1;
}
printf("%s\t",grp->gr_name);
return 0;
}
四、主函数
main.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <grp.h>
#include <pwd.h>
#include <time.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
//文件所属组用户名
int get_grpnanme(gid_t gid)
{
struct group* grp =getgrgid(gid);
if(NULL == grp)
{
printf("getgrgid failed\n");
return -1;
}
printf("%s\t",grp->gr_name);
return 0;
}
//文件所属用户名
int get_uername(uid_t uid)
{
struct passwd* pwd=getpwuid(uid);
if(NULL == pwd)
{
printf("getpwuid failed\n");
return -1;
}
printf("%s\t",pwd->pw_name);
return 0;
}
int main(int argc, const char *argv[])
{
DIR *p=opendir(argv[1]);//读取外部传参,并打开所在位置的目录
if(NULL == p) //判断是否成功
{
perror("opendir");
return -1;
}
struct dirent* rp=NULL;//定义同类型指针
while(1)
{
rp=readdir(p); //用上面定义指针接收打开目录下的文件名
if(NULL == rp) //判断是否成功
{
if(0 == errno) //由于接收失败和读取到结尾都是返回NULL需要再判断
{
printf("目录读取完毕\n");
break;
}else{
printf("perror");
return -2;
}
}
if(rp->d_name[0] == '.') //由于题目需要避开隐藏文件,而隐藏文件都以"."开头
//判断当前路径下是否有隐藏路径Linux指令为:ls -a
{
}else
{
struct stat buf; //需定义一个与调用函数同类型的结构体,接函数返回结构体
char b[100]={0};
strcpy(b,argv[1]);
strcmp(b,rp->d_name);//因为外部传入的只是目录的绝对地址,没有加上文件名
//所以需要定义一个字符数组来接收。
int a=stat(b,&buf);//这个函数没有封装,忘了。buf用来接收这个文件的一切信息
if(a<0)//判断是否成功
{
perror("stat");
return -3;
}
int i=8;
while(i >= 0)
{
int res=(buf.st_mode&(1<<i)); //文件权限八进制转换成Linux的文件权限显示方式
if(8 ==i)
{
printf("-");
}
if(res && i%3==2)
{
printf("r");
}else if(res && i%3==1)
{
printf("w");
}else if(res && i%3==0)
{
printf("x");
}else
{
printf("-");
}
i--;
}
printf("--");
printf("\t%ld\t",buf.st_nlink); //输出硬链接数
//printf("uid:%d<-->",buf.st_uid);
get_uername(buf.st_uid); //输出文件所属用户名
//printf("文件类型:%o\n",buf.st_mode);
//printf("gid:%d<-->",buf.st_gid);
get_grpnanme(buf.st_gid); //文件所属组用户名
printf("%ld\t",buf.st_size); //文件大小字节数
//printf("文件创建日期:%ld\n",buf.st_ctime);
struct tm *info=localtime(&buf.st_ctime); //定义一个结构体指针接收获取的本地时间
printf("%d-%02d-%02d %02d:%02d:%02d\t",\
info->tm_year+1900, info->tm_mon+1, info->tm_mday,\
info->tm_hour, info->tm_min, info->tm_sec);//输出格式
printf("%s\n",rp->d_name); //输出文件名
}
}
closedir(p);
return 0;
}
五、执行结果
边栏推荐
- Knowledge of the day: handwritten deep copy and shallow copy (solves the problem of circular references)
- QT连载1:readyRead()函数,数据分包不完整解决办法
- 关于报错vscode
- 重磅揭晓!第十四届深创赛福田预选赛区暨华秋第八届硬创大赛华南分赛区晋
- i++与 ++i 的区别
- 2021 soft exam intermediate pass
- BLDC电机应用持续火爆,“网红神器”筋膜枪前景几何?
- js高级学习笔记(详细)
- 探究make_shared效率
- 与所有 ARM 工具、软件兼容?韦斯佰瑞这款MCU内核值得关注!
猜你喜欢
Word使用中常用的快捷键
BLDC电机应用持续火爆,“网红神器”筋膜枪前景几何?
QT weekly skills (3)~~~~~~~~~ serial port addition
Explore the efficiency of make_shared
【markdown常用用法】
QT weekly skills (2)~~~~~~~~~ interface buttons
The most complete difference between sizeof and strlen, as well as pointer and array operation analysis
【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】
【正点原子】sys.c、sys.h位带操作的简单应用
This beta version of Typora is expired, please download and install a newer;解决方法
随机推荐
js高级学习笔记(详细)
js 替换字符串中所有 “ 引号 —— 数据处理
[Jiangsu University of Science and Technology Automation Association stm32F103c8t6] Notes [Initial 32 MCU and TIM timing interrupt initialization parameter configuration]
QT weekly skills (2)~~~~~~~~~ interface buttons
服务器基础知识:包含基本概念,作用,服务器选择,服务器管理等(学习来自米拓建站)
ssh script space character conversion
openssl1.1.1ARM双编译
信号链模拟芯片是什么?
QT连载1:readyRead()函数,数据分包不完整解决办法
Kunlun On-state Screen Production (serial 1)---Contact
conda常用命令总结(持续更新)
The most complete difference between sizeof and strlen, as well as pointer and array operation analysis
FPGA parsing B code----serial 1
VsCode与Sublime编辑器优缺点对比
三种内核结构---宏内核、微内核、混合内核
[Punctuality Atom] Learning and use of IIC (unfinished...)
VSCode隐藏左边活动栏
i++与 ++i 的区别
经典排序之插入排序
干货 | 什么是FOC?一文带你看BLDC电机驱动芯片及解决方案