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)};typedef struct __dirstream DIR;
DIR结构体类似于FILE,是一个内部结构。函数 DIR *opendir(const char *pathname),即打开文件目录,返回指向DIR结构体的指针,以下几个函数使用使用该DIR指针:
struct dirent *readdir(DIR *dp);void rewinddir(DIR *dp);int closedir(DIR *dp);long telldir(DIR *dp);void seekdir(DIR *dp,long loc);
dirent结构体,从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:
struct dirent{long d_ino;/* inode number 索引节点号 */off_t d_off; /* offset to this dirent 在目录文件中的偏移 */unsigned short d_reclen; /* length of this d_name 文件名长 */unsigned char d_type; /* the type of d_name 文件类型 */char d_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结构体的定义:
struct stat {mode_tst_mode; //文件访问权限ino_tst_ino; //索引节点号dev_tst_dev; //文件使用的设备号dev_tst_rdev; //设备文件的设备号nlink_t st_nlink;//文件的硬连接数uid_tst_uid; //所有者用户识别号gid_tst_gid; //组识别号off_tst_size;//以字节为单位的文件容量time_tst_atime;//最后一次访问该文件的时间time_tst_mtime;//最后一次修改该文件的时间time_tst_ctime;//最后一次改变该文件状态的时间blksize_t st_blksize; //包含该文件的磁盘块的大小blkcnt_t st_blocks;//该文件所占的磁盘块};
总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?
(1) 首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。
(2) 接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
(3) 然后,我们遍历d,调用stat(d->name,stat *e)函数来获取每个文件的详细信息,存储在stat结构体e中。
在这一过程中,三种结构体扮演着不同的角色。
如果觉得《DIR dirent stat结构体详解(转)》对你有帮助,请点赞、收藏,并留下你的观点哦!