最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益匪浅。

首先说说DIR这一结构体,以下为DIR结构体的定义:

struct__dirstream

{

void*__fd;

char*__data;

int__entry_data;

char*__ptr;

int__entry_ptr;

size_t__allocation;

size_t__size;

__libc_lock_define (, __lock)

};

typedefstruct__dirstream DIR;

DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:

structdirent *readdir(DIR *dp);

voidrewinddir(DIR *dp);

intclosedir(DIR *dp);

longtelldir(DIR *dp);

voidseekdir(DIR *dp,longloc);

关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。

接着是dirent结构体,首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:

structdirent

{

longd_ino;/* inode number 索引节点号 */

off_t d_off;/* offset to this dirent 在目录文件中的偏移 */

unsignedshortd_reclen;/* length of this d_name 文件名长 */

unsignedchard_type;/* the type of d_name 文件类型 */

chard_name [NAME_MAX+1];/* file name (null-terminated) 文件名,最长255字符 */

}

从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用,如果想获得类似ls -l那种效果的文件信息,必须要靠stat函数了。

通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数

int stat(const char *file_name, struct stat *buf);

的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:

structstat {

mode_t     st_mode;//文件访问权限

ino_t      st_ino;//索引节点号

dev_t      st_dev;//文件使用的设备号

dev_t      st_rdev;//设备文件的设备号

nlink_t    st_nlink;//文件的硬连接数

uid_t      st_uid;//所有者用户识别号

gid_t      st_gid;//组识别号

off_t      st_size;//以字节为单位的文件容量

time_tst_atime;//最后一次访问该文件的时间

time_tst_mtime;//最后一次修改该文件的时间

time_tst_ctime;//最后一次改变该文件状态的时间

blksize_t st_blksize;//包含该文件的磁盘块的大小

blkcnt_t   st_blocks;//该文件所占的磁盘块

};

这个记录的信息就很详细了吧,呵呵。

最后,总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?

首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。

接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。

然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。

总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。

dir结构体 linux_Linux下DIR,dirent,stat等结构体详解相关推荐

  1. mysql8.0.20安装教程linux_Linux下安装mysql-8.0.20的教程详解

    ** Linux下安装mysql-8.0.20 ** 环境介绍 操作系统:CentOS 7 mysql下载地址:https://dev.mysql.com/downloads/mysql/ 下载版本: ...

  2. maven 与intellij IDEA 下maven 为groovy 项目生成jar 详解

    2019独角兽企业重金招聘Python工程师标准>>> W7下安装 maven与intellij IDEA 下maven为groovy项目生成jar详解(适合新手) 第一步:下载ma ...

  3. Linux下的tar归档及解压缩功能详解

    Linux下的tar归档及解压缩功能详解 一.Linux下解压缩工具 二.gzip工具的使用方法 三.其他解压缩工具 一.Linux下解压缩工具 二.gzip工具的使用方法 三.其他解压缩工具 一.L ...

  4. linux下mysql数据库基础及客户端命令详解

    linux下mysql数据库基础及客户端命令详解 1.mysql数据库存储引擎: SHOW ENGINES;   #查看mysql支持的存储引擎 常见有如下两个存储引擎: MyISAM:每表三个文件: ...

  5. Win7下SQLite安装配置与使用方法详解

    Win7下SQLite安装配置与使用方法详解 2014-10-08    分类:数据库.编程开发.首页精华2人评论     来源:aehyok 分享到:更多1 前言 SQLite 是一个软件库,实现了 ...

  6. Linux下boost库的编译、安装详解

    1.下载源文件 去官网下载:http://www.boost.org/ 这里下载最新版本 wget https://dl.bintray.com/boostorg/release/1.64.0/sou ...

  7. linux为什么用tar压缩,linux下tar压缩和解压命令用法详解

    linux下tar压缩和解压命令用法详解 2017-03-25 14:06 分享人:老牛 将/usr/local/test目录下所有文件仅打包,不压缩到 /usr/local/auto_bak/目下 ...

  8. java 编译 忽略错误_Maven在Java8下如何忽略Javadoc的编译错误详解

    javaDoc简介And基础知识 (一) Java注释类型 //用于单行注释. /*...*/用于多行注释,从/*开始,到*/结束,不能嵌套. /**...*/则是为支持jdk工具javadoc.ex ...

  9. linux 子域dns,linux下搭建DNS子域及相关授权详解

    linux下搭建DNS子域及相关授权详解forward功能是本地无法解析的域名,转发给指定DNS服务器 forward only; 所有无法解析的域名,都转发给指定DNS服务器,必须有解析结果 for ...

最新文章

  1. 如何提升 Linux 服务器安全的开源工具和技巧?
  2. LNMP安装目录及配置文件位置
  3. 原生APP与web APP的区别
  4. (原創) 我有牙周病了 (日記)
  5. BPSK调制下(2,1,3)、(2,1,6)卷积码与QC-LDPC码译码性能和抑制突发噪声性能对比(MATLAB实现)
  6. linux中用户识别码,C语言中设置用户识别码的相关函数的简单讲解
  7. 一款无惧“魔改”的设计系统开源了,已支持字节跳动4000多个项目
  8. 并发编程-------操作系统的发展
  9. Gson 与 fastJson 在使用上的差异(fastJson的优点)
  10. 【Python】SVM分类 特征标准化+网格搜索最优模型参数+十折交叉验证
  11. 薇娅直播卖火箭,B 站酒泉发卫星,航天贴标生意凭什么?
  12. Protel Dxp2004 创建库
  13. php 0x80004005,解决Access出现Microsoft JET Database Engine (0x80004005)未指定的错误
  14. wpf 点击按钮弹出新对话框_WPF学习弹出新窗口
  15. 气象ts评分_天气预报评分方法评述.doc
  16. 示波器基础知识100问
  17. 英文单词之说文解字(10)你真的用对“著名”了吗?
  18. 计算机连不了无线网络,如何解决电脑连接不上家里路由器的无线网
  19. 汽车租赁app功能有哪些
  20. 常见博客程序的市场有这几个

热门文章

  1. c盘清理代码_拒接卡顿,从c盘减负、系统修复及网络加速做起!奥利~~~
  2. 将整个表单设置为只读_如何将独立网站设置为制作中,阻止搜索引擎收录网站页面?...
  3. 数据库开发设计规范及表结构设计原则
  4. matlab记录路径,matlab对文件目录路径的操作
  5. 2018阿里集团中间件Java面试题(4面)
  6. 进阶阿里架构师:算法、编程语言、数据库、架构设计!书单推荐!
  7. 肖仰华 | 大规模、高质量的金融知识图谱,如何自动化构建?
  8. 论文浅尝 | 一种可解释的语义匹配复值网络
  9. 【JavaWeb】JavaScript基础篇+高级篇
  10. 分布式系统:SrpingBoot整合Zookeeper和Dubbo的版本匹配问题