【Linux C】目录相关的操作函数 mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir

🔥博客简介: 开了几个专栏,结合工作中所用到的,针对嵌入式开发和音视频开发,做一下记录总结和分享。

🚀系列专栏: C语言、Linux、rtos、嵌入式开发、流媒体、数据结构、网络协议、开源库、CMake、Makefile、架构设计模式等。

✍️公众号:嵌入式技术部落

🍭经典语录: 天下古今之庸人,皆以一惰字致败; 天下古今之才人,皆以一傲字致败 -----曾国藩

❤️感谢大家点赞👍收藏⭐评论✍️


本文未经允许,不得转发!!!

文章目录

      • 一、概述
      • 二、mkdir 创建目录
      • 三、rmdir 删除目录
      • 四、opendir 打开目录
      • 五、readdir 读取目录
      • 六、closedir 关闭目录
      • 七、getcwd 获取目录
      • 八、chdir 改变当前工作目录

一、概述

本文介绍Linux下目录操作相关的一些函数。

mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir。

我们将从函数原型、头文件、函数作用、参数含义、返回值以及示例代码几个方面进行总结。

二、mkdir 创建目录

【1】函数原型

int mkdir(const char *path, mode_t mode);

【2】头文件

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

【3】函数作用

用于创建一个新的目录

【4】参数含义

path: 要创建的目录的路径名,可以是绝对路径也可以是相对路径。
mode: 新目录的访问权限,一般为0777。mode 参数由四个数字组成:
■ 第一个数字通常是 0
■ 第二个数字规定所有者的权限
■ 第三个数字规定所有者所属的用户组的权限
■ 第四个数字规定其他所有人的权限可能的值(如需设置多个权限,请对下面的数字进行总计):
■ 1 = 执行权限
■ 2 = 写权限
■ 4 = 读权限

【5】返回值

函数返回值为0表示成功,-1表示失败。

【6】示例

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>int main(int argc,char *argv[])
{if(-1 == mkdir("test", 0777)){printf("创建目录失败\n");}else{printf("创建目录成功\n");}return 0;
}

编译运行
在这里插入图片描述

三、rmdir 删除目录

【1】函数原型

int rmdir(const char *path);

【2】头文件

#include <unistd.h>

【3】函数作用

用于删除目录(注意,只能删除空目录)。
如果要删除非空目录,可以使用递归方式删除目录中的所有文件和子目录,然后再删除空目录。

【4】参数含义

path: 要删除的目录路径,可以是绝对路径也可以是相对路径。

【5】返回值

函数返回值为0表示成功,-1表示失败。

【6】示例

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[])
{if(-1 == rmdir("test")){printf("删除目录失败\n");}else{printf("删除目录成功\n");}return 0;
}

编译运行
在这里插入图片描述

四、opendir 打开目录

【1】函数原型

DIR *opendir(const char *name);

【2】头文件

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

【3】函数作用

该函数作用是打开指定的目录,并返回一个指向该目录的指针。
这样,程序便可以通过该指针对目录进行进一步的操作,比如遍历其中的文件和子目录

【4】参数含义

name:要打开的目录完全路径名,可以是绝对路径也可以是相对路径。
DIR:是一个结构体类型,用于表示打开的目录流。

【5】返回值

打开目录成功,返回目录流DIR结构体指针,打开目录失败,返回NULL置位错误码。当opendir函数失败时,会设置errno全局变量来表示错误原因。errno的值对应于特定的错误码,这些错误码定义在<errno.h>头文件中。要获取对应错误码的字符串描述,可以使用strerror函数。可以在调用opendir之后立即调用strerror(errno)来获取错误描述。以下是一些常见的opendir函数可能返回的错误码及其含义:
返回值/错误代码描述
DIR*成功打开目录
NULL打开失败
EACCESS权限不足
EMFILE已达到进程可同时打开的文件数上限
ENFILE已达到系统可同时打开的文件数上限
ENOTDIR参数name非真正的目录
ENOENT参数name 指定的目录不存在,或是参数name 为一空字符串
ENOMEM核心内存不足

【6】示例

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>int main()
{DIR *dir = opendir("./directory");if (dir == NULL){printf("opendir: %s\n", strerror(errno));return 1;}closedir(dir);return 0;
}

编译运行
在这里插入图片描述

五、readdir 读取目录

【1】函数原型

struct dirent *readdir(DIR * dir);

【2】头文件

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

【3】函数作用

用于读取目录流。

【4】参数含义

dir: 是一个结构体类型,用于表示打开的目录流。
struct dirent *: 参数dir目录流的下个目录进入点结构dirent 定义如下:
struct dirent
{ino_t d_ino;                // d_ino  此目录进入点的inodeff_t d_off;                 // d_off  目录文件开头至此目录进入点的位移signed short int d_reclen;  // d_reclen  d_name 的长度, 不包含NULL 字符unsigned char d_type;       // d_type  d_name所指的文件类型 har d_name[256];            // d_name  文件名
};

【5】返回值

成功则返回参数dir目录流的下一个子条目(子目录或子文件),有错误发生或读取到目录文件尾则返回NULL。
返回值/错误代码描述
struct dirent*成功读取目录项
NULL读取失败或到达目录末尾
EBADF参数dir为无效的目录流

【6】示例

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>int main(int argc, char*argv[])
{DIR *dir = opendir("./");if (dir == NULL) {printf("opendir: %s\n", strerror(errno));return 1;}struct dirent *entry = NULL;while ((entry = readdir(dir)) != NULL) {printf("Found file: %s\n", entry->d_name);}closedir(dir);
}

编译运行
在这里插入图片描述

六、closedir 关闭目录

【1】函数原型

int closedir(DIR * dir);

【2】头文件

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

【3】函数作用

关闭dir所指的目录流

【4】参数含义

dir: 目录流的指针

【5】返回值

成功返回0;失败返回-1,错误原因存于errno 中。

【6】示例

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>int main(int argc, char*argv[])
{DIR *dir = opendir("./directory");if (dir == NULL) {printf("opendir: %s\n", strerror(errno));return 1;}struct dirent *entry = NULL;while ((entry = readdir(dir)) != NULL) {printf("Found file: %s\n", entry->d_name);}int ret = closedir(dir);if(ret != 0){printf("opendir: %s\n", strerror(errno));return 1;}return 0;
}

编译运行
在这里插入图片描述
【7】注意

目录文件作为一种文件,再打开必须关闭,否则会由于文件的进程打开文件过多而不能打开新的文件。
因此opendir函数和closedir函数同样是配对出现的。

七、getcwd 获取目录

【1】函数原型

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

【2】头文件

#include <unistd.h>

【3】函数作用

获取当前工作目录

【4】参数含义

buf:保存当前工作目录的字符串缓冲区。
size:缓存区的大小。

【5】返回值

如果调用成功返回当前目录,调用失败返回 NULL。

【6】示例

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>int main()
{char buf[255];if(getcwd(buf, sizeof(buf)) != NULL){printf("Current working directory: %s\n", buf);}else {printf("getcwd: %s\n", strerror(errno));return 1;}return 0;
}

编译运行
在这里插入图片描述

八、chdir 改变当前工作目录

【1】函数原型

int chdir(const char *path);

【2】头文件

#include <unistd.h>

【3】函数作用

用来将当前的工作目录改变成以参数path所指的目录

【4】参数含义

path: 目标目录,可以是绝对目录或相对目录

【5】返回值

执行成功则返回0,失败返回-1,错误码存于errno中。

【6】示例

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>int main(int argc, char *argv[]) 
{ char buf[255];if(getcwd(buf, sizeof(buf)) != NULL) {printf("directory: %s\n", buf);}else {printf("getcwd: %s\n", strerror(errno));return 1;} int ret = chdir("/tmp");if(ret != 0){printf("chdir: %s\n", strerror(errno));return 1;}if(getcwd(buf, sizeof(buf)) != NULL) {printf("directory: %s\n", buf);}else {printf("getcwd: %s\n", strerror(errno));return 1;} return 0;
}

编译运行
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式搜索——ElasticSeach简介

一般都用数据库存储数据&#xff0c;然后对数据库进行查询获取数据&#xff0c;但是当数据量很大时&#xff0c;查询效率就会很慢&#xff08;具体下面会讲到&#xff09;&#xff0c;所以这种情况下就会使用到ElasticSeach ElasticSeach的基本介绍 ElasticSeach是一 款非常强…

2024 年第四届长三角高校数学建模竞赛C题

赛道 C&#xff1a;汽后配件需求预测问题 在汽后行业的供应链管理中&#xff0c;精准的需求预测是后续管理及决策的基础。各个汽后配件即为一个库存单位&#xff08;SKU&#xff0c;Stock Keeping Unit&#xff09;&#xff0c;如果可以准确预知未来对于各个配件的市场需求&am…

某东-绑卡

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

OpenAI王炸更新GPT-4o,具有极强的文本、图片、视频、语音混合理解能力

OpenAI刚刚发布了GPT-4o&#xff0c;这是一种新的人工智能模式&#xff0c;集合了文本、图片、视频、语音的全能模型。能够实时响应用户的需求&#xff0c;并通过语音来实时回答你&#xff0c;你可以随时打断它。还具有视觉能力&#xff0c;能识别视觉物体并根据视觉作出快速的…

鸿蒙应用开发之调用C++开发代码库3

接着下来,我们仔细分析C++代码的实现,要理解怎么样把ArkTS类型转换为C++类型,并且返回参数值时,怎么从C++的类型转换为ArkTS类型。 要想在ArkTS调用C++的代码,需要把上面的编译器信息打包到应用程序HAP里,当运行的时候,就可以找到加载的对应的声明信息。 我们从JS调用框…

并发-sleep更优雅的实现方案:TimeUnit.枚举常量.sleep()

首先给出结论&#xff1a;线程使用中的暂停&#xff0c;建议优先使用TimeUnit类中的sleep()但需要注意传入时间小于0的异常情况TimeUnit是java.util.concurrent包下的一个类名主要功能是暂停线程的操作拥有与Thread.sleep()一样的功能都是暂停线程&#xff0c;但TimeUnit提供了…

C++进阶之路:何为默认构造函数与析构函数(类与对象_中篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

3D数字化技术如何改变汽车行业?

近年来&#xff0c;新能源汽车行业加速发展&#xff0c;新车型密集发布&#xff0c;汽车保有量和车龄的增加&#xff0c;也同时点燃了汽车后市场的增长引擎。对于车企而言&#xff0c;如何全方面优化汽车从研发、生产、售后到营销的各个环节&#xff0c;以便适应快速变化的市场…

Qwen学习笔记4:Qwen 7B模型调用天气API实现天气的即时查询

前言 在学习Qwen模型的函数调用功能后&#xff0c;进一步尝试利用本地的Qwen模型访问OpenWeather API来获取实时的天气情况。 参考代码来源于视频教程&#xff1a; 简单粗暴&#xff0c;轻松配置Qwen模型查询实时数据功能_哔哩哔哩_bilibili 说明 该代码运行前&#xff0c…

Kibana使用

一、什么是Kibana   Kibana 是一个开源的分析和可视化平台&#xff0c;Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析&#xff0c;并在各种图表、表格和地图中可视化数据。 Kibana使用&#xff1a…

JVM运行时内存:虚拟机栈

文章目录 1. 概述2. 栈针3. 栈针内部结构3.1 局部变量表3.2 操作数栈3.3 动态链接3.4 方法返回地址3.5 一些附加信息 运行时内存整体结构如下图所示: 1. 概述 如何理解栈管运行&#xff0c;堆管存储&#xff1f; 角度一&#xff1a;GC;OOM角度二&#xff1a;栈、堆执行效率角…

pdfMake,xlsx-js-style,elementTable表格导出大量数据的pdf和xslx表格

使用渲染dom传递给xlsx或将dom转canvas在传给jspdf数据量大都会造成页面负载过大 所以导pdf和xlsx都使用数据传递给pdfMake,xlsx-js-style&#xff0c;pdf涉及分页与合并单元格 一.pdf npm并引入pdfMake和其字体包&#xff08;记录时使用版本0.2.10 import pdfMake from &qu…