Linux-目录I/O-004

学习重点:

1.目录I/O的函数接口
2.目录的遍历,目录的递归遍历

1.【mkdir】

1.1函数原型

【int mkdir(const char *pathname, mode_t mode);】

1.2函数功能

创建目录文件

1.3函数参数

1.3.1【pathname】

文件路径

1.3.2【mode】

文件的权限

1.4返回值

【成功】:返回0 
【失败】:返回-1

1.5源码示例

在这里插入图片描述
(1)多次执行效果为覆盖

2.【rmdir】

2.1函数原型

  【int rmdir(const char *pathname);】

2.2函数功能

    删除空目录文件

2.3函数参数

2.4返回值

    【成功】:返回0 【失败】:返回-1 

3.【opendir】

3.1函数原型

  【DIR *opendir(const char *name);】

3.2函数功能

    打开目录获得目录流指针

3.3函数参数

3.3.1【name】

    目录文件路径

3.4返回值

    【成功】:返回目录流指针【失败】:返回NULL目录流数据结构:
typedef struct{
int fd;    /*目录文件的文件描述符*/
struct dirent *dirent;    /*当前读取的目录项*/
}DIR;
说明:
【fd】:是目录文件的文件描述符。
【dirent】:字段是一个指向当前读取的目录项的指针。目录流的底层实现是通过文件描述符和目录缓存来实现的。当用户调用【opendir】函数打开一个目录时,系统会创建一个文件描述符,然后将目录文件映射到该文件描述符上,并创建一个目录缓存,用于存储读取的目录项。每次调用【readdir】函数,系统会从目录缓存中读取一个目录项,并将【dirent】 指针指向该目录项。当读取完所有的目录项后,系统会关闭文件描述符,并释放目录缓存。用户不能直接访问其内部结构,而是通过 【opendir】函数打开目录,并通过【readdir】函数读取目录项。在使用完【DIR】数据结构后,用户应该调用【closedir】函数关闭目录,以释放资源。

4.【closedir】

4.1函数原型

【int closedir(DIR *dirp);】

4.2函数功能

 关闭目录流指针

4.3函数参数

4.3.1【dirp】

目录流指针

4.4返回值

【成功】:返回0
【失败】:返回-1

5.【readdir】

5.1函数原型

  【struct dirent *readdir(DIR *dirp);】

5.2函数功能

    从目录流中读取下一个目录项的结构体信息**说明:**(1)目录流:目录流是一个抽象的概念,指的是与目录相关联的文件描述符和目录缓存,它可以用于读取目录中的目录项。(2)目录项:文件系统的目录项(directory entry)是一个数据结构(见5.4返回值),用于建立文件名和文件的【inode】号之间的映射关系。每个目录都是一个文件,它包含了多个目录项,每个目录项包含了一个文件名和一个 inode 号,以及一些其他的元数据信息,如文件类型、权限、所有者、所属组、大小、创建时间、修改时间等。当用户访问某个文件时,系统会根据文件名查找对应的目录项,获取该文件的【inode】号,然后根据【inode】号读取文件的内容。(3)目录遍历问题:【readdir】注意一点就是成功时返回目录流【dirp】中下一个目录项,是自动跳到下一个,这样结合【while】就可以遍历整个目录了。

5.3函数参数

5.3.1【dirp】

    目录流指针

5.4返回值

5.4.1返回值类型

【成功】:返回包含目录项信息的空间首地址
【失败】:返回NULL
【读到文件末尾】:返回NULL

5.4.2返回值相关说明

5.4.2.1目录项的结构体
原见【man】手册:
【struct dirent {
ino_t   d_ino;       /* Inode number( 目录的inode) */
off_t    d_off;       /* Not an offset; see below (目录文件开头至此目录进入点的偏移)*/
unsigned short    d_reclen;    /* Length of this record(d_name的长度,不包含NULL字符) */
unsigned char    d_type;      /* Type of file; not supported by all filesystem types(d_type指向的文件类型) */
char    d_name[256]; /* Null-terminated filename (目录名)*/
};】
5.4.2.2【d_ino】
5.4.2.3【d_off】
5.4.2.4【d_reclen】
5.4.2.5【d_type】
Linux文件类型:
【DT_REG】:普通文件
【DT_DIR】:目录文件
【DT_FIFO】:命名管道
【DT_SOCK】:套接字文件
【DT_CHR】:字符设备文件
【DT_BLK】:块设备文件
【DT_LNK】:符号链接文件
5.4.2.6【d_name】

5.5源码示例

在这里插入图片描述

注意:【pp->d_name】只包含文件名,不包括路径。如果要获取文件的完整路径,可以将文件名和路径拼接起来。另外,当读取完所有的目录项后,【readdir】函数会返回【NULL】,表示目录读取结束。

6【chdir】

6.1函数原型

【int chdir(const char *path);】

6.2函数功能

改变调用进程中当前工作目录为指定路径的目录。
**注意:**
(1)调用进程需要有搜索整个目录的权限。
(2)每个进程都具有一个当前工作目录。在解析相对目录引用时,该目录是搜索路径的起始目录。
(3)如果调用进程更改了目录,则它只对该进程有效,而不能影响调用它的那个进程。
(4)程序结束,返回最初的那个工作目录。

6.3函数参数

6.3.1【path】

指定的路径

6.4返回值

【成功】:返回0
【失败】:返回-1

7.【getcwd】

7.1函数原型

【char *getcwd(char *buf, size_t size);】

7.2函数功能

获取当前工作目录的绝对路径:获取当前进程的工作目录的绝对路径放在大小为size的buf中

7.3函数参数

7.3.1【buf】

存放当前工作目录的缓冲区

7.3.2【size】

缓冲区大小

7.4返回值

【成功】:返回指向 buf 的指针
【失败】:NULL

7.5源码示例

在这里插入图片描述

8【access】

8.1函数原型

【int access(const char *pathname, int mode);】

8.2函数功能

检测调用函数的程序对文件是否拥有指定权限

8.3函数参数

8.3.1【pathname】

文件路径

8.3.2【mode】

【R_OK】:检测是否拥有读权限
【W_OK】:检测是否拥有写权限
【X_OK】:检测是否拥有执行权限
【F_OK】:检测文件是否存在

8.4返回值

【有该权限】:返回0
【出错】:返回-1 

8.5源码示例

在这里插入图片描述

9目录的遍历

9.1普通遍历

int main(void)
{DIR *dp = NULL;struct dirent *pp = NULL;dp = opendir(".");if (NULL == dp){perror("fail to opendir");return -1;}while (1){pp = readdir(dp);if (NULL == pp){break;}if ('.' == pp->d_name[0]){continue;}printf("%s\n", pp->d_name);}closedir(dp);return 0;
}

9.2递归遍历

int ListDir(const char *pdirname)
{DIR *dp = NULL;struct dirent *pp = NULL;char tmpbuff[1024] = {0};dp = opendir(pdirname);if (NULL == dp){perror("fail to opendir");return -1;}while (1){pp = readdir(dp);if (NULL == pp){break;}if ('.' == pp->d_name[0]){continue;}sprintf(tmpbuff, "%s/%s", pdirname, pp->d_name);printf("%s\n", tmpbuff);if (DT_DIR == pp->d_type){ListDir(tmpbuff);}}closedir(dp);return 0;
}int main(void)
{ListDir(".");return 0;
}

9.3任意指定目录的遍历

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

6.BFC

BFC 经典真题 介绍下 BFC 及其应用介绍下 BFC、IFC、GFC 和 FFC 搞懂各种 FC 一看到 BFC、IFC、GFC 和 FFC,大家可能会想到 KFC。 然而这里所说的 xFC 和 KFC 没有任何关系。 那么这些 FC 究竟是啥呢? 不着急,我们先搞懂一个&#xff0…

MT8788|MTK8788安卓核心板参数_4G联发科MTK模块

MT8788核心板是一款功能强大的4G全网通安卓智能模块。该模块采用了联发科AIOT芯片平台,具有长达8年的生命周期。MT8788模块内置了12nm制程的八核处理器,包括4个Cortex A73和4个Coretex A53,主频最高可达2.0GHZ。标配内存为4GB64GB&#xff0c…

LLM之RAG实战(二十七)| 如何评估RAG系统

有没有想过今天的一些应用程序是如何看起来几乎神奇地智能的?这种魔力很大一部分来自于一种叫做RAG和LLM的东西。把RAG(Retrieval Augmented Generation)想象成人工智能世界里聪明的书呆子,它会挖掘大量信息,准确地找到…

小马识途分享抖音百科创建的步骤

在玩抖音的时候,不知道注意到抖音的搜索结果没有,有时候会去搜索框搜索一个品牌或人物名称,搜索框下面翻几下大概率就会出现百科词条,这个词条就是抖音百科。抖音的百科属于头条百科,因为这两个平台都属于字节跳动旗下…

浅谈WPF之利用RichTextBox实现富文本编辑器

在实际应用中,富文本随处可见,如留言板,聊天软件,文档编辑,特定格式内容等,在WPF开发中,如何实现富文本编辑呢?本文以一个简单的小例子,简述如何通过RichTextBox实现富文…

iphone6无法加载图片资源文件

在开发项目时,需要动态的展示图片 这样写之后,所有的机型全部能够正常展示,除了ipone6。查找一番原因之后发现,我的图片资源都是webp格式的图像资源,ipone6无法解析该资源为图像资源,所以无法加载。 解决方法&#x…

06.栈习题

1353:表达式括号匹配(stack) 算法思想: 1.用string存储字符串,遍历字符串 2.遇到左括号就入栈 3.遇到右括号就匹配出栈,但是再出栈之前要判断栈是否为空 a.如果栈为空,说明没有与右括号匹配的左括号,右括号…

基于springboot+vue的知识管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

1903_CoreMark白皮书阅读笔记

1903_CoreMark白皮书阅读笔记 全部学习汇总: g_embedded: 嵌入式通用技术学习笔记 (gitee.com) 再看ARM的内核架构介绍的时候看到了不同的内核都测试了一个CoreMark/Mhz的参数。从名称看,可以理解为是MCU的算力跑分。至于这部分究竟是测试了哪些功能&…

快速清理_卸载docker_找到不用的进程_centos磁盘爆满_清理磁盘---Linux工作笔记071

查看大文件,并且按照大小排名 cd / | du -h |sort -hr|head -30 可以看到根据不用的结果进行删除 可以看到在/data/dict目录很大,里面的都可以删除 然后再去卸载docker,要不然,没有磁盘是卸载不了的 systemctl stop docker systemctl stop docker.socket yum remove docker-…

Flutter Slider自定义滑块样式 Slider的label标签框常显示

1、自定义Slider滑块样式 Flutter Slider控件的滑块系统样式是一个圆点,thumbShape默认样式是RoundSliderThumbShape,如果想要使用其它的样式就需要自定义一下thumbShape; 例如需要一个上图样式的(圆点半透明圆形边框&#xff09…

线性代数:向量空间

目录 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2

ElasticStack安装(windows)

官网 : Elasticsearch 平台 — 大规模查找实时答案 | Elastic Elasticsearch Elastic Stack(一套技术栈) 包含了数据的整合 >提取 >存储 >使用,一整套! 各组件介绍: beats 套件:从各种不同类型的文件/应用中采集数据。比如:a,b,cd,e,aa,bb,ccLogstash:…

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

Google插件Sider: ChatGPT Sidebar + GPTs GPT-4 Turbo Sider

Sider: ChatGPT Sidebar 可以使得满屏都是机器人,左侧栏可以打开访问GPT-4. 配置跳板机地址 google 搜索的右侧也有打开

关于在分布式环境中RVN和使用场景的介绍4

简介 在前面的文档中,我们介绍了RVN的概念,通过RVN可以解决的某类问题和使用技巧,以及处理RVN的逻辑的具体实现。在本文中,我们将要介绍关于如何使用RVN解决另一种在分布式系统中常出现的问题。 问题 假设我们创建了一个servic…

数据驱动决策:掌握高效数据分析的七大步骤

在这个数据驱动的时代,无论是企业决策还是个人发展,数据分析都扮演着至关重要的角色。然而,想要从海量数据中提炼出有价值的信息,并不是一件容易的事情。本文为你详细解读高效数据分析,让你的数据开口说话,…

ICRA 2024:UC伯克利、斯坦福大学等共同开发机器人强化学习套件(SERL),20分钟学会装配电路板!

近年来,机器人强化学习技术领域取得显著的进展,例如四足行走,抓取,灵巧操控等,但大多数局限于实验室展示阶段。将机器人强化学习技术广泛应用到实际生产环境仍面临众多挑战,这在一定程度上限制了其在真实场…

__proto__和protype的区别

__proto__和prototype是JavaScript中两个重要的概念,它们在对象原型链和继承中起着关键作用。下面将详细解释它们之间的区别: 定义和性质: prototype:这是每一个函数创建后都会拥有的一个属性,它指向函数的原型对象。这…

集合可视化:rainbow box与欧拉图

论文:A new diagram for amino acids: User study comparing rainbow boxes to Venn/Euler diagram 最近偶然看到了这篇论文,觉得很有意思,针对的任务是集合数据的可视化。 我们用示例来说明,比如图二的欧拉图,展示的…