P8 Linux 目录操作

目录

前言

 01 mkdir 系统调用

mkdir的代码示例

 02 rmdir删除目录 

03  打开、读取以及关闭目录

3.1 opendir()函数原型:

04 读取目录 readdir()

05 struct dirent 结构体:

06 rewinddir ()函数重置目录流

07 关闭目录 closedir ()函数

测试:打印目录下的文件名与iNode

08 getcwd() 函数当前工作目录

09 改变当前工作目录chdir()和 fchdir()

 10 remove 函数删除文件


前言

                                  

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》✨✨✨ 

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨

🛸推荐专栏3: ​​​​​​《 链表_@ChenPi的博客-CSDN博客 》 ✨✨✨
🌺本篇简介  :  在上两章中我们Linux的文件系统底下的目录结构

                        这一章我们学习目录文件

目录块当中有多个目录项(或叫目录条目)

每一个目录项(或目录条目)都会对应到该目录下的某一 个文件

目录项当中记录了该文件的文件名以及它的 inode 节点编号, 

所以通过目录的目录块便可以遍历找 到该目录下的所有文件以及所对应的 inode 节点。

 01 mkdir 系统调用

mkdir()函数原型

#include <sys/stat.h> 
#include <sys/types.h> 
 
int mkdir(const char *pathname, mode_t mode); 

函数参数和返回值含义如下:

  1. pathname:需要创建的目录路径。
  2. mode:新建目录的权限设置,设置方式与 open 函数的 mode 参数一样,最终权限为(mode & ~umask)。与清0,或置1
  3. 返回值:成功返回 0;失败将返回-1,并会设置 errno。

pathname 参数指定的新建目录的路径,该路径名可以是相对路径,也可以是绝对路径,

若指定的路径 名已经存在,则调用 mkdir()将会失败。 mode 参数指定了新目录的权限,

目录拥有与普通文件相同的权限位,但是其表示的含义与普通文件却 有不同 

mkdir的代码示例

#include "stdio.h"
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
 
int main()
{
    int ret = mkdir("./next",0777);
    if(-1 == ret)
    {
            perror("mkdir error :");
            exit(-1);
    }
    return 0;
}

当执行完./a.out时在当前目录下生成一个next目录文件

 02 rmdir删除目录 

rmdir 函数函数原型:首先,使用该函数需要包含头文件。

#include <unistd.h> 
int rmdir(const char *pathname); 

函数参数和返回值含义如下: 

pathname:需要删除的目录对应的路径名,并且该目录必须是一个空目录,也就是该目录下只有.和..这 两个目录项;pathname 指定的路径名不能是软链接文件,即使该链接文件指向了一个空目录。
返回值:成功返回 0;失败将返回-1,并会设置 errno。

2.2rmdir 函数测试

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define   MY_FILE "./next"
 
void main()
{
    int ret = rmdir(MY_FILE);
    if(-1 == ret)
    {
        perror("");
        exit(-1);
    }
}

代码执行完后,刚才创建的next文件被删除

03  打开、读取以及关闭目录


打开、读取、关闭一个普通文件可以使用 open()、read()、close(),

而对于目录来说,可以使用 opendir()、readdir()和 closedir()来打开、读取以及关闭目录。

3.1 opendir()函数原型:


opendir()函数用于打开一个目录,并返回指向该目录的句柄,供后续操作使用。Opendir 是一个 C 库函数。

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

 DIR *opendir(const char *name); 

函数参数和返回值含义如下:

  1. name:指定需要打开的目录路径名,可以是绝对路径,也可以是相对路径。
  2. 返回值:成功将返回指向该目录的句柄,一个 DIR 指针(其实质是一个结构体指针),其作用类似于open函数返回的文件描述符fd,后续对该目录的操作需要使用该DIR指针变量;若调用失败,则返回NULL。


04 读取目录 readdir()

readdir()用于读取目录,获取目录下所有文件的名称以及对应 inode 号。

readdir()是 一个 C 库函数(事实上 Linux 系统还提供了一个 readdir 系统调用)

其函数原型如下所示:

#include <dirent.h> 
 
struct dirent *readdir(DIR *dirp); 

函数参数和返回值含义如下:

  1. dirp:目录句柄 DIR 指针。
  2. 返回值:返回一个指向 struct dirent 结构体的指针,该结构体表示 dirp 指向的目录流中的下一个目录条目。在到达目录流的末尾或发生错误时,它返回 NULL。

Tips:“流”是从自然界中抽象出来的一种概念,有点类似于自然界当中的水流,

在文件操作中,文件 内容数据类似池塘中存储的水,

N 个字节数据被读取出来或将 N 个字节数据写入到文件中,这些数据就构 成了字节流。

“流”这个概念是动态的,而不是静态的。编程当中提到这个概念,一般都是与 I/O 相关,所以也经 常叫做 I/O 流;但对于目录这种特殊文件来说,这里将目录块中存储的数据称为目录流,存储了一个一个 的目录项(目录条目)。

05 struct dirent 结构体:

struct dirent { 
 ino_t d_ino; /* inode 编号 */ 
 off_t d_off; /* not an offset; see NOTES */ 
 unsigned short d_reclen; /* length of this record */ 
 unsigned char d_type; /* type of file; not supported by all filesystem types */ 
 char d_name[256]; /* 文件名 */ 
}; 


对于 struct dirent 结构体,

我们只需要关注 d_ino d_name 两个字段即可,

分别记录了文件的 inode 编 号和文件名

每调用一次 readdir(),就会从 drip 所指向的目录流中读取下一条目录项(目录条目),

并返回 struct dirent结构体指针,指向经静态分配而得的 struct dirent 类型结构,

每次调用 readdir()都会覆盖该结构。一旦遇到 目录结尾或是出错,readdir()将返回 NULL,

针对后一种情况,还会设置 errno 以示具体错误。

那如何区别究 竟是到了目录末尾还是出错了呢,可通过如下代码进行判断:

#include <errno.h> 
 error = 0; 
 
 direntp = readdir(dirp); 
 if (NULL == direntp) { 
 if (0 != error) { 
 /* 出现了错误 */ 
 } else { 
 /* 已经到了目录末尾 */ 
 } 
 } 


 这段代码很好理解,观察上面一段伪代码,error变量来自于errno头文件,

将error变量设置为0,readdir()返回空指针时证明函数执行出错,

那究竟是目录末尾还是出错了呢,如果0!=error的话,

那就证明erro值被内核设置了,证明出错了

06 rewinddir ()函数重置目录流

rewinddir()是 C 库函数,可将目录流重置为目录起点,

以便对 readdir()的下一次调用将从目录列表中的 第一个文件开始。

rewinddir 函数原型如下所示:

#include <sys/types.h> 
#include <dirent.h> 
 
void rewinddir(DIR *dirp);

 函数参数和返回值含义如下:

  1. dirp:目录句柄。
  2. 返回值:无返回值。


07 关闭目录 closedir ()函数


closedir()函数用于关闭处于打开状态的目录,同时释放它所使用的资源,其函数原型如下所示:

函数参数和返回值含义如下:

#include <sys/types.h> 
#include <dirent.h> 
 
int closedir(DIR *dirp);

  1. dirp:目录句柄。
  2. 返回值:成功返回 0;失败将返回-1,并设置 errno。

测试:打印目录下的文件名与iNode

1. 打开一个目录、并将目录下的所有文件的名称 以及其对应 inode 编号打印出来。 

示例代码如下所示:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
  
#define   MY_FILE "./next"
 
void main()
{
    //1创建目录
    /*
    int ret = mkdir(MY_FILE,0777);
    if(-1 == ret)
    {
        perror("");
        exit(-1);
    }
*/
    //2打开目录文件
    DIR *fdir;
    fdir = opendir(MY_FILE);
    if(NULL == fdir)
    {
        perror("opendir");
    }
    int fd1 = open("./next/test.c", O_RDWR|O_CREAT, 0777);
    if(-1 == fd1)
    {
        perror("");
    }
 
    //3目录文件里面的文件以及inode编号
    errno = 0;
    struct dirent *ret1 ; 
    while(NULL != ( ret1 = readdir(fdir)))
    {
        printf("inode:%ld        name:%s \n",ret1->d_ino,ret1->d_name);
    }
    if(NULL == ret1)
    {
        if (errno != 0)
        {
            puts("读取目录文件出错\n");
        }else
        {
            puts("readdir succeed\n");
        }
    }
 
    //4关闭目录文件
    closedir(fdir);
}

由此可知,示例代码 能够将next目录下的所有文件全部扫描出来,打印出它们的名字以及 inode节点。

08 getcwd() 函数当前工作目录

来获取进程的当前工作目录

如下所示:

#include <unistd.h> 
 
char *getcwd(char *buf, size_t size);

函数参数和返回值含义如下:

  1. buf:getcwd()将内含当前工作目录绝对路径的字符串存放在 buf 缓冲区中。
  2. size:缓冲区的大小,分配的缓冲区大小必须要大于字符串长度,否则调用将会失败。
  3. 返回值:如果调用成功将返回指向 buf 的指针,失败将返回 NULL,并设置 errno。

Tips:若传入的 buf 为 NULL,且 size 为 0,则 getcwd()内部会按需分配一个缓冲区,并将指向该缓冲区 的指针作为函数的返回值,为了避免内存泄漏,调用者使用完之后必须调用 free()来释放这一缓冲区所占内 存空间。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
void main()
{
    char *str = getcwd(NULL,0);
    printf("%s ",str);
    free(str);
}

09 改变当前工作目录chdir()和 fchdir()

系统调用 chdir()和 fchdir()可以用于更改进程的当前工作目录

chdir()和 fchdir()函数原型:

#include <unistd.h> 
 
int chdir(const char *path); 
int fchdir(int fd); 

函数参数和返回值含义如下:

  1. path:将进程的当前工作目录更改为 path 参数指定的目录,可以是绝对路径、也可以是相对路径,指定的目录必须要存在,否则会报错。
  2. fd:将进程的当前工作目录更改为 fd 文件描述符所指定的目录(譬如使用 open 函数打开一个目录)。
  3. 返回值:成功均返回 0;失败均返回-1,并设置 errno。

此两函数的区别在于,指定目录的方式不同,

chdir()是以路径的方式进行指定,

而 fchdir()则是通过文件 描述符,文件描述符可调用 open()打开相应的目录时获得。

6.2 代码测试

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
void main()
{
    char *str = NULL ;
 
    str = getcwd(NULL,0);
    printf("%s\n ",str);
    free(str);
 
    /* 更改进程的当前工作目录 */ 
    int ret = chdir("/home/chen/"); 
    if (-1 == ret) { 
    perror("chdir error"); 
    exit(-1); 
    } 
    
    str = getcwd(NULL,0);
    printf("%s\n ",str);
    free(str);
}

 10 remove 函数删除文件

remove()是一个 C 库函数,用于移除一个文件或空目录,其函数原型如下所示:

函数原型:

#include <stdio.h> 
 
int remove(const char *pathname); 

使用该函数需要包含 C 库函数头文件。

函数参数和返回值含义如下:

  1. pathname:需要删除的文件或目录路径,可以是相对路径、也可是决定路径。
  2. 返回值:成功返回 0;失败将返回-1,并设置 errno。

pathname 参数指定的是一个非目录文件,那么 remove()去调用 unlink(),

如果 pathname 参数指定的是 一个目录,那么 remove()去调用 rmdir()。
与 unlink()、rmdir()一样,remove()不对软链接进行解引用操作,

若 pathname 参数指定的是一个软链接 文件,

则 remove()会删除链接文件本身、而非所指向的文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

temu缺货订单号在哪里查

在拼多多的商家后台管理系统Temu中&#xff0c;查找缺货订单号是非常重要的。及时了解缺货订单的情况&#xff0c;可以帮助商家更好地处理订单&#xff0c;提供良好的客户服务。本文将介绍在Temu中如何查找缺货订单号&#xff0c;以及处理缺货订单的步骤和注意事项。 先给大家推…

【c】小红的漂亮串

#include<stdio.h> #include<string.h> int main() {char arr[1000];int count0;gets(arr);//在数组中输入字符串int lenstrlen(arr);//求字符串长度printf("%d\n",len);for(int i0;i<len;i){if(arr[i]r){if(arr[i1]e){if(arr[i2]d){countcount1;}}}}…

SpringBoot框架+原生HTML开发,基于云端SaaS服务方式的电子病历编辑器源码

一体化电子病历编辑器源码&#xff0c;电子病历系统 一体化电子病历系统基于云端SaaS服务的方式&#xff0c;采用B/S&#xff08;Browser/Server&#xff09;架构提供&#xff0c;覆盖了医疗机构电子病历模板制作到管理使用的整个流程。除实现在线制作内容丰富、图文并茂、功能…

软著项目推荐 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

Leetcode 92 反转链表II

反转链表II 题解1 一遍遍历&#xff08;穿针引线&#xff09; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 提示&#xff1a; 链表中节点数目…

MacOS VSCode 配置远程服务器ssh remote链接,并上传文件文件服务器

环境&#xff1a; MacOS & VSCode & ssh remote 1. VSCode安装插件 2. 配置ssh remote链接 Host 10.128.200.101HostName 10.128.200.101User rootForwardAgent yesIdentityFile ~/.ssh/id_rsa # 服务器免密登录本地秘钥文件路径 配置完保存&#xff1b; 3. 在ssh…

98基于matlab的在MIMO通信系统中功率优化算法的仿真

基于matlab的在MIMO通信系统中&#xff0c;功率优化算法的仿真&#xff0c;重点研究了注水功率分配算法。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 98matlab功率优化功率分配 (xiaohongshu.com)

Halcon reduce_domain和scale_image的作用

在Halcon中&#xff0c;reduce_domain是用于缩小图像域&#xff08;Image Domain&#xff09;的操作。 它的作用是通过指定一个感兴趣区域&#xff08;ROI&#xff0c;Region of Interest&#xff09;&#xff0c;将图像数据限制在该区域内&#xff0c;从而实现对图像进行裁剪…

地震反演基础知识3

文章目录 地震勘探原理1 地震波1. 1 地震波概念1. 2 波的传播1. 2. 1 波传播的基本原理1. 2. 2 地震波的反射,折射,透射的1. 2. 3 地震子波&#xff08;seismic wavelet&#xff09;1. 2. 4 地震合成记录 2 地震时距曲线2.1 地震时距曲线作用2.2 不同波的时距曲线2.2.1 直达波时…

在 Windows 桌面的redis中远程连接到 VMware 中运行的 Linux 上的 Redis

先修改一下docker容器中的redis(一会连上之后看效果) 我使用的是VMware的虚拟机 选择的网络设置为桥接模式 查到虚拟机独立的ip是如下 允许 Linux 虚拟机上的 Redis 监听外部连接&#xff1a; 打开 Linux 虚拟机上的 Redis 配置文件。在大多数系统上&#xff0c;配置文件位于…

94. 二叉树的中序遍历(Java)

目录 解法&#xff1a; 思路 官方解答&#xff1a; 方法一&#xff1a;递归 思路与算法 代码&#xff1a; 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 方法二&#xff1a;迭代 思路与算法 复杂度分析 时间复杂度&#xff1a; 空间复杂度 给定一个…

【SpringBoot】SpringBoot配置Swagger

文章目录 前言配置步骤使用步骤总结 前言 使用Swagger只需要按照规范去定义接口及接口的相关信息&#xff0c;就可以做到生成接口文档和在线接口调试页面 官网&#xff1a;Swagger官网 Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案 配置步骤 1.导入knife4j的m…

新课程杂志新课程杂志社新课程编辑部2023年第13期目录

教育前沿_新时代教育 基于“互联网课程思政”的小学语文教学实施路径——以部编版六年级上册《桥》为例 潘霞; 1-3 立德树人&#xff0c;德育为先——以小学语文爱国主义教育为例 王蕾; 4-6《新课程》投稿&#xff1a;cn7kantougao163.com 发挥红色资源优势 培育新…

项目设计---智力冲刺

文章目录 一. 项目描述二. 核心技术三. 需求分析概要设计四. 详细设计4.1 实现用户模块4.1.1 约定前后端交互接口4.1.2 实现数据库设计4.1.3 客户端页面展示4.1.4 服务器功能实现 4.2 实现匹配模块4.2.1 约定前后端交互接口4.2.2 客户端页面展示4.2.3 服务器功能实现 4.3 实现对…

Linux学习笔记(九)MISC设备驱动

前言 misc 的意思是混合、杂项的&#xff0c;因此 MISC 驱动也叫做杂项驱动。也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。 MISC 驱动其实就是最简单的字符设备驱动&#xff0c;通常嵌套在 platform 总线驱动中&#xff0c;实现复杂的驱动&#xff0…

信号完整性分析

目录 前言一、信号完整性SI1.1 信号失真1.2 串扰1.3 衰减 二、电源完整性PI2.1 地弹2.2 电源轨道塌陷 三、电磁兼容EMC3.1 电磁辐射3.2 抗干扰 前言 本篇介绍信号完整性分析的知识体系&#xff0c;以及部分分析方法。   什么是信号完整性?通俗来讲&#xff0c;信号在互连线的…

花生壳安装在ubuntu下,记住要SN号登陆

在ubantu18.0.4上下载花生壳 进入花生壳的下载链接 选择linux版本进行下载 记住选ubuntu 运行命令phddns start

使用阿里巴巴同步工具DataX实现Mysql与ElasticSearch(ES)数据同步

一、Linux环境要求 二、准备工作 2.1 Linux安装jdk 2.2 linux安装python 2.3 下载DataX&#xff1a; 三、DataX压缩包导入&#xff0c;解压缩 四、编写同步Job 五、执行Job 六、定时更新 6.1 创建定时任务 6.2 提交定时任务 6.3 查看定时任务 七、增量更新思路 一、Linux环境要…

智能优化算法应用:基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工大猩猩部队算法4.实验参数设…