Linux读取目录函数readdir以及inode结构简介

【Linux C】目录相关的操作函数 mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir 本文介绍Linux下目录操作相关的一些函数。 mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir。 我们将从函数原型、头文件、函数作用、参数含义、返回值以及示例代码几个方面进行总结。 阅读详情
readdir
  语法: struct dirent* readdir(DIR* dir_handle);
  返回值: dirent结构
  函数种类: 文件存取
  内容说明 本函数用来读取目录。返回目录中的文件名称,读取不依照inode,依据的是dirent结构
中的d_off

inode

inode(发音:eye-node)译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名>、使用者及群组等。
UNIX/LINUXInode介绍

简介

  inode 是 UNIX操作系统中的一种数据结构,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中创建文件系统时,同时将会创建大量的inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。

  有时,人们使用了一些不同的术语,如 inode 和索引编号(inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。inode 指的是数据结构;而索引编号实际上是inode 的标识编号,因此也称其为inode编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。下一个部分将介绍inode 中的其他一些属性。

  inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX 系统通过inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode,并对其进行适当的更改。

  例如,使用 vi 来编辑一个文件。当您键入 vi<filename> 时,在 inode 表中找到 inode编号之后,才允许您打开该 inode 。在 vi 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入 :wq时,将关闭并释放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。

inode 的结构

  对于经验丰富的 UNIX 开发人员或者管理员来说, inode的结构相对比较简单,但是可能还有一些您尚不了解的、令人惊讶的有关 inode 的内幕。下面的定义仅给出了 inode中所包含的、UNIX 用户经常使用的一些重要信息:

  ● inode 编号

  ● 用来识别文件类型,以及用于 stat C 函数的模式信息

  ● 文件的链接数目

  ● 属主的 UID

  ● 属主的组 ID (GID)

  ● 文件的大小

  ● 文件所使用的磁盘块的实际数目

  ● 最近一次修改的时间

  ● 最近一次访问的时间

  ● 最近一次更改的时间

  从根本上讲, inode 中包含有关文件的所有信息(除了文件的实际名称以及实际数据内容之外)。可以在 AIX 的Header 文件 /usr/include/jf/ino.h 中、或者 Web 页面 中可以找到完整的 inode 结构。

  以上所列举的信息对于文件来说非常重要,并且在 UNIX中频繁使用。如果没有这些信息,那么文件将被认为遭到破坏和不可用。

  与其他的操作系统相比,UNIX 系统中的目录和文件可能看起来有所不同,但事实并非如此。在 UNIX中,目录本身就是文件,只是在它们的 inode 中使用了一些附加的设置。目录 本质上就是一个包含了其他文件的文件。另外,其模式信息中设置了一些相应的标志,以告知系统该文件实际上是一个目录。

使用 inode

  了解如何在 UNIX 中使用 inode 可以节约大量的时间,并提高工作效率。在尚未了解 inode之前,您可以使用下面的命令,以减少可能碰到的问题。

  df 命令

  如前所述,当您在 UNIX 中创建一个文件系统时,将为 inode表分配大约百分之一的总磁盘空间。每次在文件系统中创建一个文件时,都会为该文件分配一个 inode 。通常,与一个文件系统相关联的inode 的数目足够多,但耗尽 inode 的可能性始终存在。要监视是否发生了这种情况,您可以观察 df 的输出。

  使用 df 命令,您可以查看所有已挂载的文件系统或者特定的文件系统。在该命令的输出中,您可以查看各个文件系统中已使用的inode 的数目,以及文件系统中总体使用情况百分比,如清单 1 中所示。

  清单 1. 使用 df 来监视 inode 的使用

  

# df -k|head -6
  Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
  /dev/hd4 229376 138436 40% 4730 13% /
  /dev/hd2 8028160 962692 89% 110034 33% /usr
  /dev/hd9var 1835008 366400 81% 25829 24% /var
  /dev/hd3 524288 523564 1% 98 1% /tmp
  /dev/hd1 32768 32416 2% 5 1% /home

 

  如果由于某种原因,某个文件系统 inode的使用率达到百分之百,那么您将无法在该文件系统中创建更多的文件、设备、目录等等。对于这种情况,一种解决方案是通过 smittychfs 命令为该文件系统添加更多的空间,如图 1 所示。另一种解决方案是创建较小的 inode 区段。现在,在增强的日志文件系统(Enhanced Journal File System) 中,IBM AIX 5L 允许 inode 区段小于 16KB的缺省大小。请记住,如果您在 AIX 5L 中使用这个选项,那么将无法从较早版本的 AIX 访问该文件系统。

  图 1. smitty chfs 命令的结果

  ‍

  

  

[1]

istat 和 stat

  在 AIX 中检查 inode 的一种快捷的方式是使用 istat命令。使用这个命令,您可以找到特定文件的索引编号,以及其他的 inode项目,如权限、文件类型、UID、GID、链接的数目(非符号链接)、文件大小和最近一次更新、最近一次修改以及最近一次访问的时间戳。

  清单 2 显示了 AIX 中文件 /usr/bin/ksh 的 inode 信息。

  清单 2. /usr/bin/ksh 的 inode 信息

  

# istat /usr/bin/ksh
  Inode 18150 on device 10/8 File
  Protection: r-xr-xr-x
  Owner: 2(bin) Group: 2(bin)
  Link count: 5 Length 237804 bytes
  Last updated: Wed Oct 24 17:37:10 EDT 2007
  Last modified: Wed Apr 18 23:58:06 EDT 2007
  Last accessed: Mon Apr 28 11:25:35 EDT 2008

 

  除了显示来自 istat 的标准信息之外,现在您还知道了 /usr/bin/ksh对应的索引编号。如果您同时还找到了该文件所处的逻辑卷,那么甚至可以显示更多的信息。要查找该信息,一种方式是通过使用 df命令来查看该文件位于哪个已挂载的文件系统中:

  

# df /usr/bin
Filesystem 512-blocks Free %Used Iused %Iused
Mounted on/dev/hd2 16056320 1925384 89% 110034 33% /usr

 

  文件 /usr/bin/ksh 位于目录 /usr/bin 中。查看 df 命令的输出,您可以发现,目录 /usr/bin包含于 /usr 文件系统中,并且 /usr 文件系统位于逻辑卷 /dev/hd2之中。现在,您已经知道了索引编号和逻辑卷的名称,那么就可以将这两个信息项作为参数来使用istat,这样一来,您可以确定组成该文件的磁盘块的十六进制地址,如清单 3 中所示。

  清单 3. 确定文件磁盘块的十六进制地址

  

# istat 18150 /dev/hd2
  Inode 18150 on device 10/8 File
  Protection: r-xr-xr-x
  Owner: 2(bin) Group: 2(bin)
  Link count: 5 Length 237804 bytes
  Last updated: Wed Oct 24 17:37:10 EDT 2007
  Last modified: Wed Apr 18 23:58:06 EDT 2007
  Last accessed: Mon Apr 28 11:44:20 EDT 2008
  Block pointers (hexadecimal):
  11620 ef8c0

 

  Linux 提供了其特有的 istat 版本:stat。Linux stat 命令可以显示类似的信息,并且还包括一些在AIX istat 命令中没有提供的命令开关:

  

# stat /bin/bash
 File:`/bin/bash' Size: 722684 Blocks: 1432 IO Block: 4096
regularfileDevice: fd00h/64768d Inode: 12799859 Links: 1
Access:(0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2008-04-0619:13:50.000000000 -0400
Modify: 2006-07-12 03:11:53.000000000-0400
Change: 2007-11-22 04:05:30.000000000 -0500

 

  ls 命令

  在您的日常工作中总会碰到这样的情况,难以删除或者管理某些文件,因为这些文件的文件名中使用了短横线或者其他特殊字符、或者其文件名完全不正确。这很可能是有人对该文件进行了错误命名。

  因为 UNIX 中的大多数命令,包括开关或者选项在内,都是以连字符 (-) 或者双连字符 (--) 开头的,很难使用诸如rm、mv 和 cp 之类常用的命令来操作这些文件。幸运的是,某些命令提供了一些选项,以用来显示相关文件所关联的 inode的索引编号。ls 命令就提供了一个这样的选项:

  

# ls - -- -p fileA fileB fileCfileDfileE fileF fileG fileH fileI fileJ fileK fileL

 

  使用 ls -i 命令,您可以看到文件名称旁边的索引编号,如清单 4中所示。现在,您已经知道了文件的索引编号,那么就可以很容易地操作该文件了。

  清单 4. 查看文件的索引编号

  

# ls –i
  38988 38991 -p 38984 fileC 38982 fileF 38977 fileI 38978 fileL
  38989 - 38980 fileA 38986 fileD 38983 fileG 38987 fileJ
  38990 -- 38979 fileB 38976 fileE 38985 fileH 38981 fileK

 

  find 命令

  使用 UNIX find 命令,您可以完成使用 ls命令所开始的工作。对于要进行操作的文件,您已经知道了它们的索引编号,那么就可以开始进行相应的操作了!

  要删除看似无名的文件,您只需要使用 find 和 -inum 开关对索引编号和文件进行定位。然后,在找到该文件之后,使用find 和 -exec 开关删除该文件:

  

# find . -inum 38988 -exec rm {} \;

 

  要对该文件进行重命名,可以再次进行相同的操作,但这一次使用 mv 而不是 rm:

  

# find . -inum 38989 -exec mv {} fileM \;

 

  为了验证取得了预期的结果,只需要再次使用 ls -i 命令:

  

# ls -i
38990 -- 38979 fileB 38976 fileE 38985 fileH 38981fileK
38991 -p 38984 fileC 38982 fileF 38977 fileI 38978 fileL
38980fileA 38986 fileD 38983 fileG 38987 fileJ 38989 fileM

 

  fsck 命令

  不幸的是,硬件设备不可能一直使用下去,系统可能会在使用多年后出现故障。当发生这种情况,以及由于电源故障或者某些其他问题而导致操作系统异常关闭的时候,您可能会在还原系统备份时碰到一些在崩溃期间处于打开状态的文件,并且现在需要对其加以处理。此时,您可能会碰到一些需要修复inode 或者存在错误的消息。如果发生这种状况,那么 fsck 命令可以用来救急!您可以使用 fsck 来修复文件系统或者修正受损的inode ,而不是还原系统、或者甚至重新构建操作系统。

  下面的命令可以尝试修复逻辑卷 /dev/hd1:

  

# fsck –p /dev/hd1 –y

 

  通过使用 fsck 命令,您还可以缩小受损 inode 的搜索范围。如果您正在搜索一个特定的 inode ,那么可以使用带-ii-NodeNumber 开关的 fsck 命令。

结束语

  如果没有 inode ,那么 UNIX 中的文件和目录将根本无法使用。希望在阅读完本文之后,您可以更好地了解 inode、它们对于 AIX 系统的重要性,以及如何管理它们。您可能会对 df 命令的看法大为改观。


Linux 中对目录的操作 (opendir readdir getcwd chdir等函数) Linux系统函数之文件系统管理(三) 对于目录的操作 opendir函数 ​ 作用:打开一个目录 ​ 头文件:include &lt;sys/types.h&gt; #include &lt;dirent.h&gt; ​ 函数原型:DIR *opendir(const char *name) ​ 返回值:成功返回一个指向DIR结构体的指针 ,失败返回NULL ​ ... 阅读详情

相关推荐

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

readdir()函数:读取目录函数

1,头文件: #include <sys/types.h> #include <dirent.h> 2,定义函数: struct dirent * readdir(DIR * dir); 3,函数说明: readdir()返回参数dir 目录流的下个目录进入点 4,结构体定义: struct dirent { ino_t d_ino; //d_ino 此目录进入点的inode ff_t d_off; //d_off 目录文件开头至此目录进入点的位移

lj19990824的博客 2万+

Java课程设计——扫雷游戏程序

使用Java语言对扫雷游戏的复刻

m0_60671275的博客 3501

opendir和readdir

是C标准库的函数,而不是底层的系统调用。系统调用通常提供更底层的操作,而这些库函数是在系统调用的基础上构建的。在不同的操作系统上,这些库函数可能会有所不同,但它们的基本功能相似。是用于文件和目录操作的C标准库函数,而不是系统调用。它们用于在C/C++程序中访问文件系统中的目录和文件。用于打开一个目录,并返回一个指向目录的指针(称为目录流)。这些函数通常与其他文件和目录操作函数一起使用,例如。用于获取文件信息,以便进一步处理文件。用于读取目录中的条目(包括子目录和文件)。

leimeili的博客 3106

Python《打砖块》小游戏

Python《打砖块》小游戏!

PanDaoxi 1276

DW1000开发笔记(一)DW1000芯片概览

一、DW1000介绍 DW1000(官方网站)是一个完全集成的低功耗射频收发器,遵循IEEE 802.15.4-2011 超宽带标准。它可以被用于双向测距或者TDOA定位系统中,精度为10cm。它使用了从3.5Ghz-6.5Ghz的6个射频频段,支持100kbps、850kbps、6.8Mbps的数据速率,并且可以在多径环境下进行处理,所以可在高反射的环境下应用。 DW1000内部最高层次的概览图如下: 二、DW1000的引脚和接口 DW1000芯片使用QFN-48封装,引脚图如下: DW1000内部

Mculover666的博客(嵌入式) 1万+

linux readdir

linux readdir

xiaozhi 1235

Python 爬虫实战:爬取去哪儿网酒店评价,提取住宿体验关键词

本文介绍了基于去哪儿网酒店评价数据的爬取与分析方法。首先通过分析网页结构和数据加载机制,定位到评价数据的JSON接口及关键参数。然后使用Python搭建爬虫环境,实现多页评价数据的批量采集与存储,并通过反爬策略确保数据获取的稳定性。在文本分析环节,采用jieba分词和TF-IDF算法提取高频关键词,结合词云可视化展示用户关注点。分析结果显示位置、服务、卫生是核心关注维度,同时识别出好评与差评的关键驱动因素。该方法为酒店服务优化和消费者决策提供了数据支持,并可通过扩展实现更深入的情感分析和竞品对比。

2503_91057718的博客 1000

readdir的用法

readdir(读取目录) 相关函数 open,opendir,closedir,rewinddir,seekdir,telldir,scandir 表头文件 #include #include 定义函数 struct dirent * readdir(DIR * dir); 函数说明 readdir()返回参数dir目录流的下个目录进入点。 结构dirent定义如下 struc

Nio96的专栏 5507

世界模型(World Models)进展全景调研(截至 2025-08)

A5) 2019-07(待核验) | C-SWM:Contrastive Structured World Models(Kipf et al.)A6) 2019-07(待核验) | SLAC:Stochastic Latent Actor-Critic(Lee et al.)A3) 2015-12(背景注记,待核验) | Embed to Control(E2C,Watter et al.)Nature 2020)Repro/Code:werner-duvaud/muzero-general(社区)

u013250861的博客 489

一根同轴线,真的扛得住 4K 吗? ——从摄像头带宽算起,聊透车载 SerDes 接口选型

如果你记住这三句话,这篇文章就值了:🎯摄像头带宽 = 分辨率 × 位深 × fps × 开销4K RAW 摄像头 ≈ 3.7Gbps,是现实不是理论SerDes 选型,宁可多留 20%,不要刚刚好。

weixin_43199439的博客 193

linux c readdir 顺序,Linux读取目录函数readdir以及inode结构简介

readdir语法: struct dirent* readdir(DIR* dir_handle);返回值: dirent结构函数种类: 文件存取内容说明 本函数用来读取目录。返回目录中的文件名称,读取不依照inode,依据的是dirent结构中的d_offinodeinode(发音:eye-node)译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名、使用者及群组等。UNIX...

weixin_29120409的博客 695

【Jenkins】Jenkins :首次登录直接使用 admin 账户

目录 一、使用admin账户 二、修改admin用户密码 三、管理视图 一、使用admin账户 安装时,自定义安装,选择必要的插件安装,设置Jenkins的URL为: http://本机或服务器IP:8080 然后在创建第一个管理者界面,直接选择:使用admin 二、修改admin用户密码 进入:系统管理——管理用户——选中用户——点击设置图标——修改密码: 三、...

顾三殇 —— 博客空间(软件测试) 1万+

linux的readir函数,readdir()函数 Unix/Linux

readdir -读取目录条目内容简介#include #include int readdir(unsigned intfd, struct dirent *dirp, unsigned intcount);描述This is not the function you are interested in. Look atreaddir(3) for the POSIX conforming C ...

weixin_36338808的博客 401

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux系统提供的接口函数-系统IO(二)

我们联想一下windows 在 windows下我们双击普通文件相当于就是打开了这个文件, 我们看到的就是该文件的内容 ,同理我们双击文件夹也应该打开了这个文件夹(目录) 理应我们看到就是文件夹的内容 ,那么这就意味着我们访问一个文件夹 ,其实得到的就是这个文件夹下子文件或者子文件夹的属性信息。​目录项数组的本质就是一个结构体数组 ,每一个目录项都对应一个结构体,这个结构体的类型是 struct dirent,我们如果想要知道一个目录下面的文件内容 ,那么就必须要去读目录项。​“目录项”是什么呢?

QJ敬的博客 407

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux getdents 例子,Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容

上回我们说到,如何创建文件夹和文件。我们发现,在sysfs中,inode并不那么重要。这是因为我们所要读写的信息已经就在内存中,并且已经形成了层次结构。我们只需有dentry,就可以dentry->fsdata,就能找到我们读些信息的来源 --- sysfs_dirent结构。这也是我觉得有必要研究 sysfs的原因之一,因为它简单,而且不涉及具体的硬件驱动,但是从这个过程中,我们可以把文件...

weixin_34358799的博客 1534

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

利用目录函数(opendir,readdir,closedir)查找文件个数

一、简介 如何知道一个目录下的所有文件个数呢?Linux系统io函数为我们提供了目录操作函数。我们可以利用它来递归的读取目录,从而知道指定目录下有多少个文件。 二、函数接口 1、opendir函数 函数原型: DIR *opendir(const char *name); 依赖头文件: #include <sys/types.h> #include <dirent.h> ...

有理论,有实验,有结论,可为一篇文章 1540

Linux文件属性

Linux文件属性1.Linux中常见文件类型2.常用文件属性获取2.1stat命令获取文件信息2.2 系统调用(stat、fstat、lstat)获取文件信息3.文件权限管理3.1文件权限位3.2access函数3.3chmod函数4.读取目录文件4.1opendir与readdir函数4.2可重入函数介绍 1.Linux中常见文件类型 普通文件(- regular file) 目录文件(...

Hundreays 1444

Linux下DIR,dirent,stat等结构体详解

最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益匪浅。 首先说说DIR这一结构体,以下为DIR结构体的定义: struct __dirstream       {        void *__fd;         char *__data;         int __entry_data

大数据 957

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

打开、读取、关闭一个普通文件可以使用 open()、read()、close(),而对于目录来说,可以使用 opendir()、readdir()和 closedir()来打开、读取以及关闭目录。opendir()函数用于打开一个目录,并返回指向该目录的句柄,供后续操作使用。readdir()用于读取目录,获取目录下所有文件的名称以及对应 inode 号。closedir()函数用于关闭处于打开状态的目录,同时释放它所使用的资源。

Bit_Dong的博客 1万+

Linux C中readdir()函数:读取目录函数

头文件:#include <sys/types.h> #include <dirent.h> 函数原型:struct dirent * readdir(DIR * dir); 函数功能:readdir()返回参数dir 目录流的下个目录进入点。结构dirent 定义如下: struct dirent { ino_t d_ino; //d_ino 此目录进入...

modi000的博客 3697

C语言遍历文件目录:readdir,opendir

环境:Linux系统 头文件: #include&lt;sys/types.h&gt; #include&lt;dirent.h&gt; 一、opendir 原型 DIR* opendir (const char * path ); 参数与功能 path为目录路径,打开一个目录,在失败的时候返回一个空的指针。 返回值 DIR*,DIR结构体类似于FILE,是一个内部结构,以下...

SweeNeil 1万+
上一篇: bash处理的12个步骤流程图
下一篇: find命令详解
AstrayLinux
博客等级 码龄15年 55粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值