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

摘要:

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

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

最近在看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__dirstreamDIR;

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;/*inodenumber索引节点号*/off_td_off;/*offsettothisdirent在目录文件中的偏移*/unsignedshortd_reclen;/*lengthofthisd_name文件名长*/unsignedchard_type;/*thetypeofd_name文件类型*/chard_name[NAME_MAX+1];/*filename(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_tst_mode;//文件访问权限ino_tst_ino;//索引节点号dev_tst_dev;//文件使用的设备号dev_tst_rdev;//设备文件的设备号nlink_tst_nlink;//文件的硬连接数uid_tst_uid;//所有者用户识别号gid_tst_gid;//组识别号off_tst_size;//以字节为单位的文件容量time_tst_atime;//最后一次访问该文件的时间time_tst_mtime;//最后一次修改该文件的时间time_tst_ctime;//最后一次改变该文件状态的时间blksize_tst_blksize;//包含该文件的磁盘块的大小blkcnt_tst_blocks;//该文件所占的磁盘块};

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

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

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

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

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

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

告诉自己,我这次失败了,重新开始吧!下次我会吸取教训,不让自己犯同样的错误的

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

相关文章:

你感兴趣的文章:

标签云: