当前位置:网站首页>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;
}
五、执行结果

边栏推荐
猜你喜欢

多层板的层数,为啥选项都是偶数?就不能选奇数?

QT Weekly Skills (1) ~~~~~~~~~ Running Icon

Acwing Brush Questions Section 1

二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通

The IEEE under the specified journal search related papers

QT serial port dynamically displays a large number of data waveform curves in real time (5) ======== "Final perfect solution version"

VSCode隐藏左边活动栏

Explore the efficiency of make_shared

虚拟机栈帧结构

QT serial 3: LORA test platform based on QT and STM32H750 (2)
随机推荐
迪文串口屏幕制作(连载一)=====准备工作
多层板的层数,为啥选项都是偶数?就不能选奇数?
(*(void (*)())0)() Interpretation
闭包(你不知道的JS)
QT serialization 1: readyRead() function, the solution to incomplete data subcontracting
VsCode打开终端的方法
华秋第八届硬创赛与安创加速器达成战略合作,助力硬科技项目成长
虚拟机栈帧结构
VsCode连接远程服务器并修改文件代码
Vim查找字符
高集成度 MCU 市场增大,如何加速 BLDC 领域落地应用
TCP建立连接的过程
干货 | 什么是FOC?一文带你看BLDC电机驱动芯片及解决方案
js 替换字符串中所有 “ 引号 —— 数据处理
你不知道的JS思考题
Duplicate keys detected:‘/da…‘
Insertion Sort in Classic Sort
QT serial 4: LORA test platform based on QT and STM32H750 (3)
How to open terminal in VsCode
VsCode与Sublime编辑器优缺点对比