9.4 Linux_I/O_访问目录、文件属性

news2024/9/27 7:23:03

访问目录

1、打开关闭目录

打开目录函数声明如下:

//1.直接打开指定路径的目录文件
DIR *opendir(const char *name);
//2.先用open打开目录文件,再用该函数访问目录文件
DIR *fdopendir(int fd);

返回值:成功返回指向打开的目录文件的结构体指针(流指针),失败返回NULL

name:目录的路径

fd:文件描述符

关闭目录函数声明如下:

int closedir(DIR *dirp);

返回值:成功返回0,失败返回EOF

dirp:指向目录的流指针

2、读目录

函数声明如下:

struct dirent *readdir(DIR *dirp);

返回值:失败或读到末尾返回NULL,成功可以通过结构体读取目录内容,类似 ls-a 效果

dirp:指向目录的流指针

实现 ls -a 效果代码:

具体代码实现如下:

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>

int main(){
	
	DIR* dp = NULL;
	struct dirent* dt = NULL;
	//1.打开目录
	if((dp = opendir("../linux_test")) == NULL){
		perror("opendir");
		return -1;
	}
	//2.获取并打印目录中的文件名
	while(1){
		dt = readdir(dp);//读取目录信息
		if(dt == NULL){
			break;
		}else{
			printf("%s ",dt->d_name);//dt的d_name代表文件名,依次读取即可
		}
	}
	puts("");
	//3.关闭目录
	closedir(dp);
	return 0;
}

代码执行结果如下:

文件属性

1、修改文件权限

函数声明如下:

//直接通过文件路径,修改指定文件的权限
int chmod(const char *pathname, mode_t mode);

//先通过open打开文件,再通过fd修改指定文件权限
int fchmod(int fd, mode_t mode);

返回值:成功返回0,失败返回EOF

pathname:文件的路径

fd:文件描述符

mode:权限,与命令chmod的使用方式完全一致。

示例代码如下:

具体代码实现如下:

#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>

int main(){
	if(chmod("./file",0444) == EOF){
		perror("chmod");
		return -1;
	}
	return 0;
}

代码执行结果如下:

2、获取文件的属性

函数声明如下:

//当为链接文件时,获取目标的文件属性
int stat(const char *pathname, struct stat *statbuf);
//需要先用open打开文件,再调用该函数,作用与stat一样
int fstat(int fd, struct stat *statbuf);

//当为链接文件时,获取链接文件自身的文件属性
int lstat(const char *pathname, struct stat *statbuf);

返回值:成功返回0,失败返回EOF

pathname:文件的路径

fd:文件描述符

statbuf:存放文件属性的结构体

struct stat 结构体中所关注的成员如下:

struct stat {
    mode_t st_mode;   //文件的类型和存储的权限
    uid_t  st_uid;    //用户ID
    gid_t  st_gid;    //组ID
    off_t  st_size;   //文件的大小       
    time_t st_atime;  //最后一次访问的时间
    time_t st_mtime;  //最后一次修改的时间
    time_t st_ctime;  //最后一次改变属性的时间
    .....             //其他的一些成员
}

文件类型相关宏如下:

使用方法为,将struct stat结构体的成员st_mode传入宏,如果是相应的文件类型则返回1

S_ISREG(st_mode)    //是否为常规文件
S_ISDIR(st_mode)    //是否为目录文件
S_ISCHR(st_mode)    //是否为字符文件
S_ISBLK(st_mode)    //是否为块文件
S_ISFIFO(st_mode)   //是否为管道文件
S_ISLNK(st_mode)    //是否为链接文件
S_ISSOCK(st_mode)   //是否为套接字文件

文件权限获取方式如下:

struct stat结构体的成员st_mode的低9位代表文件的权限,bit8~bit0分别表示用户、用户组、其他用户的rwx权限,当位的值为1时,代表有权限,具体含义如下:

使用 stat 实现 ls -l 功能:

具体代码实现如下:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
int main(){
	struct stat buf;
	int i;
	struct tm* tTime = NULL;
	//1.stat获取文件属性
	if(stat("./file",&buf) == EOF){
		perror("stat");
		return -1;
	}
	//2.访问文件属性
	//2.1 打印文件大小
	printf("file size = %ld\n",buf.st_size);
	//2.2 打印文件类型
	if(S_ISREG(buf.st_mode)){ 				
		printf("this is regular file\n");
	}
	//2.3 打印文件权限
	printf("文件的权限为:");
	for(i=8;i>=0;i--){
		if(buf.st_mode & (0x01<<i)){
			switch(i%3){
				case 0:
					printf("x");
					break;
				case 1:
					printf("w");
					break;
				case 2:
					printf("r");
					break;
			}
		}else{
			printf("-");
		}
	}
	puts("");
	//2.4 打印文件时间
	tTime = localtime(&buf.st_atime);
	printf("文件的最后一次访问时间为:%d年%02d月%02d日,星期%d,%02d:%02d:%02d\n",\
			tTime->tm_year + 1900, \
			tTime->tm_mon + 1, \
			tTime->tm_mday, \
			tTime->tm_wday, \
			tTime->tm_hour, \
			tTime->tm_min, \
			tTime->tm_sec \
			);
	return 0;
}

代码运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK-05-skywalking监控SpringCloud服务日志

文章目录 前言一、引入依赖二、增加日志配置文件三、打印日志四、skywalking网页查询链路五、日志收集5.1 修改logback-spring.xml5.2 重启SpringCloud服务并请求test接口5.3 查看skywalking网页的Log 总结 前言 基于上一章节&#xff0c;现在使用skywalkin监控SpringCloud服务…

JWT令牌技术介绍及使用

一、JWT介绍 JWT是JSON Web Token的缩写&#xff0c;即JSON Web令牌&#xff0c;是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务…

D. Determine Winning Islands in Race (cf div2,dp、图论最短路)

D. Determine Winning Islands in Race 思路: bfs找到E到达每个点的最短时间t[i]。 如果E要超过B&#xff0c;那么一定要借助辅助桥&#xff0c;从而获胜。 假设有u->v的辅助桥&#xff0c;E能通过这个桥超过B的条件是: s>u 且 t[v] < v-s 即 s的取值要为[u1,v-t[v]-…

C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)

目录 1.数组类 2.运算符重载 2.1加号运算符 2.1.1成员函数实现 2.1.2全局函数实现 2.1.3加号重载 2.2左移运算符 2.3递增运算符 2.4指针运算符 2.5赋值运算符 1.数组类 //默认构造函数 MyArray::MyArray() {m_Size 0;m_Capacity 100;pAddress new int[m_Capacity]…

【有啥问啥】深度解析迁移学习(Transfer Learning)

深度解析迁移学习&#xff08;Transfer Learning&#xff09; 在机器学习领域&#xff0c;迁移学习&#xff08;Transfer Learning&#xff09;作为一种强大的技术&#xff0c;正广泛应用于各种实际场景中。本文将详细解析迁移学习的基本概念、原理、分类、应用场景以及具体实…

vue3中storeToRefs让store中的结构出来的数据也能变成响应式

1、首先需要安装pinia 具体安装和使用教程参考 2、创建 src/stores/counter.js 文件&#xff0c;其内容如下&#xff1a; import {defineStore} from "pinia"; import {ref} from "vue";export const useCounterStore defineStore(counter,()>{const…

C语言程序设计题目十九:编写一万年历系统

文章目录 题目十九&#xff1a;编写一万年历系统calendar.hcalendar.ctest.c 题目十九&#xff1a;编写一万年历系统 要求&#xff1a; 模仿现实中的挂历&#xff0c;显示当前月的每一天及星期几&#xff0c;当系统日期变为下一个月时&#xff0c;自动翻页到下一个月。 calend…

【第3期】INFINI Easysearch 免费认证培训开放报名

探索 Easysearch 的无限可能&#xff0c;与 INFINI Labs 共赴搜索技术前沿&#xff01; 随着数字化转型的加速&#xff0c;搜索技术已成为企业数据洞察的核心。INFINI Labs 作为搜索创新技术的引领者&#xff0c;诚邀所有对 Easysearch 搜索引擎感兴趣的开发者、技术爱好者及合…

安卓13禁止待机 永不休眠 android13永不休眠

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 设置 =》显示 =》屏幕超时 =》 永不。 我们通过修改系统待机时间配置,来达到设置屏幕超时的配置。像网上好多文章都只写了在哪里改,改什么东西,但是实际上并未写明为什么要改那…

[智能控制】【第2 章 模糊控制的理论基础】

目录 第2章 模糊控制的理论基础 2.1 概述——模糊控制的提出 2.1 概述——模糊控制的特点 2.2 模糊集合 2.2.1 模糊集合 1 特征函数和隶属函数 2 模糊集合的表示 例2.1 例2.2 2.2.2 模糊集合的运算 1 模糊集合的基本运算 &#xff08;1&#xff09;空集…

docker搭建clickhouse并初始化用户名密码

1、新建挂载目录 mkdir -p /home/clickhouse-server/ mkdir -p /home/clickhouse-server/etc/2、拉取镜像 docker pull clickhouse/clickhouse-server3、创建临时容器 docker run -d --rm --name clickhouse-server --ulimit nofile262144:262144 clickhouse/clickhouse-ser…

目标检测流程

流程概述 背景&#xff1a;梳理目标检测标注&#xff0c;训练&#xff0c;部署全流程。供后续初学者快速上手 方案&#xff1a;Ubuntu&#xff08;PC端&#xff09;进行标注&#xff0c;基于OpenMMLab进行训练得到pt模型&#xff0c;pt模型通过转换rknn并部署。 1. 数据集 公…

成都睿明智科技有限公司可靠吗?

在这个短视频风靡的时代&#xff0c;抖音已不仅仅是一个娱乐平台&#xff0c;它更是无数商家眼中的蓝海市场&#xff0c;是电商领域的新宠儿。在这场流量与转化的盛宴中&#xff0c;成都睿明智科技有限公司以其敏锐的市场洞察力和专业的服务能力&#xff0c;正逐步成为抖音电商…

使用three.js 实现着色器草地的效果

使用three.js 实现着色器草地的效果 在线预览https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idgrassShader 在 https://threehub.cn 中还有很多案例 import * as THREE from three import { OrbitControls…

Java基础(Arrays工具类)(asList()方法)(详细)

目录 一、Arrays工具类 &#xff08;1&#xff09;引言 &#xff08;2&#xff09;基本介绍 &#xff08;3&#xff09;主要功能&#xff08;提供的方法&#xff09; &#xff08;I&#xff09;排序&#xff08;Arrays.sort()&#xff09; &#xff08;II&#xff09;搜索(查找…

IDEA自动清理类中未使用的import包

目录 1.建议清理包的理由 2.清理未使用包的方式 2.1 手动快捷键清理 2.2 设置自动清理 1.建议清理包的理由 有时候项目类文件中会有很多包被引入了&#xff0c;但是并没有被使用&#xff0c;这会增加项目的编译时间并且代码可读性也会变差。在开发过程中&#xff0c;建议设…

ISP去噪(3)_图像的高频分量和低频分量

#图像分析# 总是不好确认头发和毛绒玩具到底是低频还是高频分量。现在得出结论&#xff0c;头发和毛绒玩具都是高频信息&#xff0c;因为细节很多。 目录 图像的频率 (1) 什么是低频? (2) 什么是高频? &#xff08;3&#xff09;低频和高频对比 &#xff08;4&#xf…

谷歌今天发布了两款升级版Gemini模型:Gemini-1.5-Pro-002和Gemini-1.5-Flash-002

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

免杀笔记 ---> 无痕Hook?硬件断点 Syscall!

说到Hook&#xff0c;我们有很多Hook&#xff0c;像Inline-Hook&#xff0c;我们也是用的比较多&#xff0c;但是正如我上一篇Blog说的&#xff0c;他会对内存进行修改&#xff0c;如果EDR或者AV增加一个校验机制&#xff0c;不断检验某一块内存&#xff0c;那么就算你用syscal…

Flink 结合kafka 实现端到端的一致性原理

Kafka 事务实现原理 Flink checkpoint 结合kafka 实现端到端的一致性 为啥taskState 的时候要开启一个新事务&#xff0c;因为本来做state 就相当于把barrier之前的状态做一个快照&#xff0c;相当于是一个新的开始&#xff0c;所以开启一个新的事务。那为啥checkpoint 第一步要…