【Linux C | 文件操作】目录相关操作 | mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

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

目录

  • 🎄一、概述
  • 🎄二、mkdir、rmdir 函数
    • ✨2.1 mkdir 函数
    • ✨2.2 rmdir 函数
  • 🎄三、读取目录
    • ✨3.1 DIR 结构体
    • ✨3.2 struct dirent 结构体
    • ✨3.3 opendir 函数
    • ✨3.4 readdir 函数
    • ✨3.5 closedir 函数
  • 🎄四、getcwd、chdir 函数
  • 🎄五、总结


在这里插入图片描述

🎄一、概述

本文介绍Linux下目录相关的一些函数,mkdir、rmdir、getcwd、opendir、readdir、closedir。

  • mkdir:创建一个新的空目录
  • rmdir:删除一个空目录
  • getcwd:获取当前目录
  • opendir:打开一个目录
  • readdir:读取一个目录
  • closedir:关闭一个目录

在这里插入图片描述

🎄二、mkdir、rmdir 函数

这节介绍创建、删除一个空目录。

✨2.1 mkdir 函数

函数原型:

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

mkdir 函数创建一个新的空目录。其中,...目录项是自动创建的。所指定的文件访问权限mode由进程的文件模式创建屏蔽字修改。

✨2.2 rmdir 函数

函数原型:

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

rmdir 函数可以删除-一个空目录。空目录是只包含...这两项的目录。

看例子:

#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>int main()
{int ret = mkdir("./test_mkdir", 0664);if(ret == -1){perror("mkdir");//return -1;}ret = rmdir("./test_mkdir");if(ret == -1){perror("rmdir");return -1;}return 0;
}

注意:mkdir、rmdir这两个函数的功能比较局限,可以使用system直接调用mkdir、rmdir两个shell命令使用创建目录和删除目录。

在这里插入图片描述

🎄三、读取目录

读取目录的话,需要三个函数,opendir、readdir、closedir,在学习这几个函数前,先看看两个结构体DIRstruct dirent

✨3.1 DIR 结构体

DIR 结构体是描述目录流的,一般由opendir打开一个目录返回。它在<dirent.h>头文件中被声明为一个不透明的数据类型。不透明是指在Linux应用层该结构体成员是不可见的,也就是说,Linux应用层不会使用到DIR结构体的成员。

struct __dirstream
{void *__fd; /* `struct hurd_fd' pointer for descriptor.   */char *__data; /* Directory block.   */int __entry_data; /* Entry number `__data' corresponds to.   */char *__ptr; /* Current pointer into the block.   */int __entry_ptr; /* Entry number `__ptr' corresponds to.   */size_t __allocation; /* Space allocated for the block.   */size_t __size; /* Total valid data in the block.   */__libc_lock_define (, __lock) /* Mutex lock for this structure.   */
};
typedef struct __dirstream DIR;

一般情况下,由opendir函数获取DIR*指针,由下面这些函数使用DIR*指针

#include <dirent.h>
struct dirent *readdir(DIR *dp);
void rewinddir(DIR *dp);
int closedir(DIR *dp);
long telldir(DIR *dp);
void seekdir(DIR *dp,long loc);

✨3.2 struct dirent 结构体

struct dirent* 结构体是指向目录结构的指针,在使用readdir函数读取目录时会返回,包含了读取到的目录下某个条目的信息。

struct dirent {ino_t          d_ino;       /* Inode number 索引节点号*/off_t          d_off;       /* Not an offset; see below 在目录文件中的偏移*/unsigned short d_reclen;    /* Length of this record 文件名长*/unsigned char  d_type;      /* Type of file; not supportedby all filesystem types */char           d_name[256]; /* Null-terminated filename */
};

这个结构体常用的成员是d_name(文件名),d_type(文件类型),d_type有如下取值:

  • DT_BLK This is a block device.
  • DT_CHR This is a character device.
  • DT_DIR This is a directory.
  • DT_FIFO This is a named pipe (FIFO).
  • DT_LNK This is a symbolic link.
  • DT_REG This is a regular file.
  • DT_SOCK This is a UNIX domain socket.
  • DT_UNKNOWN The file type could not be determined.

✨3.3 opendir 函数

函数原型:

#include <dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd);  // glibc 2.4 版本之后有效
成功返回一个指向目录流的指针。失败返回NULL,并设置errno。

opendir函数打开与目录名对应的目录流,并返回指向该目录流的指针。流位于目录中的第一个条目处。

fdopendir函数类似于opendir,但返回由打开文件描述符fd引用的目录的目录流。成功调用fdopendir后,fd由实现内部使用,否则应用程序不应使用。


✨3.4 readdir 函数

函数原型:

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

readdir函数返回一个指向目录结构的指针,该结构表示目录流中由dirp指向的下一个目录条目。它在到达目录流的末尾或发生错误时返回NULL


✨3.5 closedir 函数

函数原型:

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

closedir函数关闭与dirp关联的目录流。成功调用closedir()还会关闭与dirp相关联的底层文件描述符。

此调用之后,目录流描述符dirp不可用。


看例子:

#include <stdio.h>
#include <dirent.h>int main() {DIR *dir;struct dirent *dirItem;dir = opendir("/tmp");if (dir != NULL) {while ((dirItem = readdir(dir)) != NULL) {switch(dirItem->d_type){case DT_DIR:printf("%14s","directory: ");break;case DT_REG:printf("%14s","regular file: ");break;default:printf("%14s","unknow file: ");break;}printf("%s\n", dirItem->d_name);}closedir(dir);} else {perror("Couldn't open directory");}return 0;
}

在这里插入图片描述

在这里插入图片描述

🎄四、getcwd、chdir 函数

getcwd 函数函数原型:

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

getcwd返回调用进程的当前工作目录的绝对路径名,以null结尾的字符串。路径名将作为函数结果并通过参数buf(如果存在)返回。向此函数传递两个参数,一个是缓冲地址buf,另一个是缓冲的长度size(单位:字节)。该缓冲必须有足够的长度以容纳绝对路径名再加上一个null终止字符,否则返回出错。


chdir 函数函数原型:

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

chdir将调用进程的当前工作目录更改为path中指定的目录。
fchdirchdir相同;唯一的区别是该目录是作为打开的文件描述符提供的。


看例子:

#include <stdio.h>
#include <string.h>
#include <unistd.h>int main() {char buf[256] = {0,};getcwd(buf,sizeof(buf));printf("cwd:[%s]\n",buf);sprintf(buf,"%s%s",buf,"/test_mkdir");printf("buf:[%s]\n",buf);chdir(buf);memset(buf, 0, sizeof(buf));getcwd(buf,sizeof(buf));printf("cwd:[%s]\n",buf);return 0;
}

在这里插入图片描述

🎄五、总结

本文介绍Linux系统编程中,目录相关操作的几个函数:mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

【LeetCode】栈精选9题

目录 1. 删除字符串中的所有相邻重复项&#xff08;简单&#xff09; 2. 逆波兰表达式&#xff08;中等&#xff09; 3. 基本计算器 II&#xff08;中等&#xff09; 4. 字符串解码&#xff08;中等&#xff09; 5. 验证栈序列&#xff08;中等&#xff09; 6. 小行星碰撞…

新能源汽车智慧充电桩方案:基于视频监控的可视化智能监管平台

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩方案围绕互联网、物联网、车联网、人工智能、视频技术、大数据、4G/5G等技术&#xff0c;结合云计算、移动支付等&#xff0c;实现充电停车一体化、充电桩与站点管理等功能&#xff0c;达到充电设备与站点的有效监控…

有效防范网络风险的关键措施

在数字化时代&#xff0c;企业面临着日益复杂和频繁的网络风险。提高员工的网络安全意识是防范网络威胁的关键一步。本文将探讨企业在提升网络安全意识方面可以采取的措施&#xff0c;以有效预防潜在的网络风险。 1. 开展网络安全培训&#xff1a;企业应定期组织网络安全培训&…

vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

文章目录 一、v-model是什么二、什么是语法糖三、v-model常见的用法1、对于输入框&#xff08;input&#xff09;&#xff1a;2、对于复选框&#xff08;checkbox&#xff09;&#xff1a;3、对于选择框&#xff08;select&#xff09;&#xff1a;4、对于组件&#xff08;comp…

java基本算法

1.链表 链表用来存储数据&#xff0c;由一系列的结点组成。这些结点的物理地址不一定是连续的&#xff0c;即可能连续&#xff0c;也可能不连续&#xff0c;但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表内的数据类型可以是多种多样的。数组也是…

中霖教育:2024年一建、二建考试问题整理

报名、考试时间&#xff1a; ①一建&#xff1a;报名时间6月;考试时间9月上旬 ②二建&#xff1a;报名时间1-3月份;考试时间6月 考试科目&#xff1a; ①一级建造师考试科目一共有四门,依次是《建设工程经济》、《建设工程法规及相关知识》、《建设工程项目管理》、《专业工…

Vue以弹窗形式实现导入功能

目录 前言正文 前言 由于个人工作原因&#xff0c;偏全栈&#xff0c;对于前端的总结还有些初出茅庐&#xff0c;后续会进行规整化的总结 对应的前端框架由&#xff1a;【vue】avue-crud表单属性配置&#xff08;表格以及列&#xff09; 最终实现的表单样式如下&#xff1a;…

深入浅出AI落地应用分析:国内Top10应用

接下来会每周集中体验一些通用或者垂直的AI落地应用&#xff0c;主要以一些全球或者国外国内排行较前的产品为研究对象&#xff0c;「AI 产品榜&#xff1a; aicpb.com」以专题的方式在博客进行分享。 1. 文心一言 产品链接&#xff1a;https://yiyan.baidu.com/ 产品介绍&…

UE5 C++ 学习笔记 UBT UHT 和 一些头文件

总结一些似懂非懂的知识点&#xff0c;从头慢慢梳理。 任何一个项目都有创建这些三个.cs。 这个是蓝图转C 这个是本身就是C项目,应该就是多了一个GameModeBase类 Build.cs包含了每个模块的信息&#xff0c;表明了这个项目用到了哪一些模块。该文件里的using UnrealBuilTool 是…

c JPEG 1D DCT

步骤&#xff1a; 1. 对yuv 88 数据 8行分别1D DCT 2, 用8行 1D DCT 得到的数据生成中间88 块 Zj 3,对Zj 的8列再 1D DCT 后生成8列,用这8列组合成8*8的2D DCT 系数 准备用此1D DCT程序代替以前写的2D DCT,看能减少多少编码时间。 看网上文章&#xff0c;ffmpeg用…

什么是车载信息娱乐系统和集成驾驶舱

什么是车载信息娱乐系统(IVI)? “车载信息娱乐(IVI)”通过向驾驶员和乘客提供信息和娱乐&#xff0c;为驾驶提供便利和舒适。为了理解这个概念&#xff0c;有必要知道“信息娱乐”的含义。“信息娱乐”是这个市场中使用的一个词&#xff0c;它结合了“信息”和“娱乐”两个词…

5.文本文件编辑命令

1.cat 用于查看纯文本文件&#xff08;内容较少的&#xff09; 加上-n参数&#xff0c;显示内容加行号 [rootlocalhost ~]# cat -n /etc/sysconfig/network-scripts/ifcfg-ens160 2.more 用于查看纯文本文件&#xff08;内容较多的&#xff09; 还可以使用空格键或回车 键…

使用pyechart创建折线图

import json from pyecharts.charts import Line from pyecharts import options# 首先使用文件打开数据 f_us open(Desktop/python/Project/数据可视化/美国.txt,r,encoding"UTF-8") f_rb open(Desktop/python/Project/数据可视化/日本.txt,r,encoding"UTF-8…

Springboot+vue项目部署所有遇到的坑

https://flowus.cn/siriusx/share/0a818075-372b-4948-88af-c75c1d10ceab项目地址及笔记 Spring Boot3VUE3前后端分离项目基于Jwt的校验方案 环境搭建 安装jdk17 安装mysql server https://ubuntu.com/server/docs/databases-mysql 将服务器root账号由系统验证改为密码验证…

SSL证书中RSA算法跟ECC算法的区别

RSA算法和ECC算法指的是SSL证书的加密算法&#xff0c;详细解释如下&#xff1a; RSA算法&#xff1a;国际标准算法&#xff0c;应用较早的算法之一&#xff0c;普遍性更强&#xff0c;同比ECC算法的适用范围更广&#xff0c;兼容性更好&#xff0c;一般采用2048位的加密长度&…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05-5+6

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05-56 5. An Example 2D例子6. Extended Kalman Filter扩展卡尔曼滤波器&#xff08;EKF&#xff09; 5. An Example 2D例子 6. Extended Kalman Filter扩展卡尔曼…

【centos 安装配置nginx】nginx负载均衡、限流配置

本篇博客将详细介绍如何在centos上安装并配置nginx&#xff0c;步骤详细&#xff0c;希望能帮助到刚接触nginx的伙伴。 一、安装插件 1.安装gcc插件 因为nginx是用c语言编写的&#xff0c;所有要安装gcc。先检查是否已经安装过了。 提示&#xff1a;一般租的服务区里面是都有…

v3的响应式,ref,reactive和生命周期(简写)

vue3笔记 1.两种安装方式 (1)直接创建项目vue3 (2)使用vite 组件传值 1.组件传值的用法 从父组件向子组件传值&#xff1a; <Son :prop1"nmb"></Son> 2.defineprops函数 defineProps函数在setup标签内不需要引入&#xff0c;可直接使用 defineP…

web学习笔记(十六)

目录 HTML5新增标记汇总 1.新增语义化标签 2.新增音频和视频标签 2.1音频标签 audio 2.1视频标签 video 3.新增图像标签 4.新增表单元素和表单控件 HTML5新增标记汇总 1.新增语义化标签 新增语义化标签能够便于开发者阅读和写出更优雅的代码同时让浏览器或是网络爬虫可…