打开、读取以及关闭目录[ opendir()、 readdir()和 closedir() ]

这篇具有很好参考价值的文章主要介绍了打开、读取以及关闭目录[ opendir()、 readdir()和 closedir() ]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


打开、读取、关闭一个普通文件可以使用 open()、read()、close(),而对于目录来说,可以使用 opendir()、readdir()和 closedir()来打开、读取以及关闭目录。

一、打开目录 opendir

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

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

DIR *opendir(const char *name);

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

二、读取目录 readdir

readdir()用于读取目录,获取目录下所有文件的名称以及对应 inode 号。这里给大家介绍的 readdir()是一个 C 库函数(事实上 Linux 系统还提供了一个 readdir 系统调用),其函数原型如下所示:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

首先,使用该函数需要包含头文件<dirent.h>。
函数参数和返回值含义如下:
dirp:目录句柄 DIR 指针。
返回值:返回一个指向 struct dirent 结构体的指针,该结构体表示 dirp 指向的目录流中的下一个目录条目。在到达目录流的末尾或发生错误时,它返回 NULL。

Tips:“流”是从自然界中抽象出来的一种概念,有点类似于自然界当中的水流,在文件操作中,文件内容数据类似池塘中存储的水,N 个字节数据被读取出来或将 N 个字节数据写入到文件中,这些数据就构成了字节流。
“流”这个概念是动态的,而不是静态的。编程当中提到这个概念,一般都是与 I/O 相关,所以也经常叫做 I/O 流;但对于目录这种特殊文件来说,这里将目录块中存储的数据称为目录流,存储了一个一个的目录项(目录条目)。

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 以示具体错误。

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

error = 0;
direntp = readdir(dirp);

if (NULL == direntp) 
{
	if (0 != error) 
	{
		/* 出现了错误 */
	} 
	else 
	{
		/* 已经到了目录末尾 */
	} 
}

使用 readdir()返回时并未对文件名进行排序,而是按照文件在目录中出现的天然次序(这取决于文件系统向目录添加文件时所遵循的次序,及其在删除文件后对目录列表中空隙的填补方式)。

当使用 opendir()打开目录时,目录流将指向了目录列表的头部(0),使用 readdir()读取一条目录条目之后,目录流将会向后移动、指向下一个目录条目。这其实跟 open()类似,当使用 open()打开文件的时候,文件位置偏移量默认指向了文件头部,当使用 read()或 write()进行读写时,文件偏移量会自动向后移动。

rewinddir 函数

rewinddir()是 C 库函数,可将目录流重置为目录起点,以便对 readdir()的下一次调用将从目录列表中的第一个文件开始。

rewinddir 函数原型如下所示:

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

void rewinddir(DIR *dirp);

首先,使用该函数需要包含头文件<dirent.h>。
函数参数和返回值含义如下:
dirp:目录句柄。
返回值:无返回值。

三、关闭目录 closedir 函数

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

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

int closedir(DIR *dirp);

首先,使用该函数需要包含头文件<sys/types.h>和<dirent.h>。
函数参数和返回值含义如下:
dirp:目录句柄。
返回值:成功返回 0;失败将返回-1,并设置 errno。

示例代码

打开一个目录、并将目录下的所有文件的名称以及其对应 inode 编号打印出来。文章来源地址https://www.toymoban.com/news/detail-688419.html

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

int main(void) 
{
	 struct dirent *dir;
	 DIR *dirp;
	 int ret = 0;
	 
	 /* 打开目录 */
	 dirp = opendir("./my_dir");
	 if (NULL == dirp) 
	 {
		 perror("opendir error");
		 exit(-1);
	 }
	 
	 /* 循环读取目录流中的所有目录条目 */
	 errno = 0;
	 while (NULL != (dir = readdir(dirp)))
	 printf("%s %ld\n", dir->d_name, dir->d_ino);
	 if (0 != errno) 
	 {
		 perror("readdir error");
		 ret = -1;
		 goto err;
	 } 
	 else
		 printf("End of directory!\n");
	 
	err:
		 closedir(dirp);
		 exit(ret);
}

到了这里,关于打开、读取以及关闭目录[ opendir()、 readdir()和 closedir() ]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • qt学习:实战 记事本 + 快捷键 + 鼠标滚轮 + 打开读取写入关闭文件

    目录 功能 步骤  配置ui界面 添加图片资源 添加头文件和定义成员数据和成员函数 在构造函数里初始化 增加当前字体大小函数 减小当前字体大小函数 在用户按下 Ctrl 键的同时滚动鼠标滚轮时,执行放大或缩小操作 多选框变化后发出信号绑定槽函数来改变编码 编辑框的光标

    2024年04月11日
    浏览(51)
  • 【Java 进阶篇】MySQL启动与关闭、目录结构以及 SQL 相关概念

    MySQL是一个常用的关系型数据库管理系统,通过启动和关闭MySQL服务,可以控制数据库的运行状态。本节将介绍如何在Windows和Linux系统上启动和关闭MySQL服务。 在Windows上启动和关闭MySQL服务 启动MySQL服务 在Windows上,MySQL服务可以通过以下步骤启动: 打开Windows服务管理器。您可

    2024年02月07日
    浏览(49)
  • Python---文件、基本操作:打开open,写入write,关闭close,读取read/readlines,移动光标seek,mode模式

    文件: 内存中存放的数据在计算机关机后就会消失。 要长久保存数据 ,就要使用硬盘、光盘、U 盘等设备。 为了便于数据的管理和检索,引入了 “文件 ”的概念。 像移动硬盘,内存卡,网盘等等。 一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予

    2024年02月03日
    浏览(56)
  • Web 自动化测试案例——关闭某视频网站弹出广告以及打开登录框输入内容

    人生苦短,我用Python。许久没写博客了,今天又是久违的参与话题的讨论,话题的内容是: 如何入门 Python 的? 这个话题对于我来说有点小尴尬,因为我没有系统的学习过 Python 这门语言,只不过在写些算法题、小demo接触过,还有就是帮朋友搞大数据作业时(爬取数据、分析

    2024年02月10日
    浏览(77)
  • Web 自动化测试案例(入门级)——关闭某视频网站弹出广告以及打开登录框输入内容

    人生苦短,我用Python。许久没写博客了,今天又是久违的参与话题的讨论,话题的内容是: 如何入门 Python 的? 这个话题对于我来说有点小尴尬,因为我没有系统的学习过 Python 这门语言,只不过在写些算法题、小demo接触过,还有就是帮朋友搞大数据作业时(爬取数据、分析

    2024年02月06日
    浏览(69)
  • SAP_ABAP_编程基础_文件处理(CRUD)_R3系统_打开文件 / 关闭文件 / 删除文件 / 向文件中写入数据 / 从文件中读取数据 / 使用服务器上的文件

    SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客 文章浏览阅读490次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料! https://blog.csdn.net/java_zhong1990/article/details/132469977 平时在  ‘ 工地搬砖 ’,很少关

    2024年02月22日
    浏览(48)
  • 【PYTHON笔记】:文件打开和关闭

    目录 文件打开: open()函数 文件路径(file参数): 文件打开模式(mode参数) buffering参数: 文件的关闭:    close函数 文件:             存储在某种介质上的信息集合 文件存储方式: 顺序存储方式,随机存储方式 文件分类:         二进制文件,文本文件 python文件系

    2023年04月14日
    浏览(38)
  • 如何打开关闭Edge鼠标手势

    今天突然发现edge有了一个鼠标手势,用起来不是很适应,所以决定将其关掉。 点击edge右上角的三个点 在下拉菜单中选择设置 点开设置之后出现如图所示的界面,然后选择外观 往下面拉页面会找到启用鼠标手势的按钮,如果关闭的话就如图所示。 如果需要打开edge的手势那

    2024年02月08日
    浏览(89)
  • QFile:文件的打开与关闭

    输出结果: 打开成功 QFile::open: File already open 打开失败 输出结果: 打开成功 打开成功 基于结果,我做一个判断,当QFile对象被析构时,被打开的文件会被关闭(close)。   

    2024年02月01日
    浏览(39)
  • 在Mac上关闭/打开聚焦索引

    运行不是很流畅,风扇嗡嗡转,看了一下进程,聚焦的索引建立吃内存太多,平时也不用这个,网上搜索了一下,把这个关闭。 使用 launchctl 管理 MacOS服务。这里卸载Spotlight的配置.卸载配置之后,就不会再启动mds等进程来扫描文件,这样后续新增App或者文件,在Spotlight和Al

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包