最近在看Linux下文件操做相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益不浅。node
首先说说DIR这一结构体,如下为DIR结构体的定义:linux
接着是dirent结构体,首先咱们要弄清楚目录文件(directory file)的概念:这种文件包含了其余文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义可以看出,dirent不单单指向目录,还指向目录中的具体文件,readdir函数一样也读取目录下的文件,这就是证据。如下为dirent结构体的定义:网站
1.struct dirent 2.{ 3. long d_ino; /* inode number 索引节点号 */ 4. 5. off_t d_off; /* offset to this dirent 在目录文件中的偏移 */ 6. 7. unsigned short d_reclen; /* length of this d_name 文件名长 */ 8. 9. unsigned char d_type; /* the type of d_name 文件类型 */ 10. 11. char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */ 12.}
从上述定义也可以看出来,dirent结构体存储的关于文件的信息不多,因此dirent一样也是起着一个索引的做用,若是想得到相似ls -l那种效果的文件信息,必需要靠stat函数了。ui
经过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数this
int stat(const char *file_name, struct stat *buf);spa
的做用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。如下为stat结构体的定义:指针
1.struct stat { 2. 3. mode_t st_mode; //文件访问权限 4. 5. ino_t st_ino; //索引节点号 6. 7. dev_t st_dev; //文件使用的设备号 8. 9. dev_t st_rdev; //设备文件的设备号 10. 11. nlink_t st_nlink; //文件的硬链接数 12. 13. uid_t st_uid; //全部者用户识别号 14. 15. gid_t st_gid; //组识别号 16. 17. off_t st_size; //以字节为单位的文件容量 18. 19. time_t st_atime; //最后一次访问该文件的时间 20. 21. time_t st_mtime; //最后一次修改该文件的时间 22. 23. time_t st_ctime; //最后一次改变该文件状态的时间 24. 25. blksize_t st_blksize; //包含该文件的磁盘块的大小 26. 27. blkcnt_t st_blocks; //该文件所占的磁盘块 28. 29. };
这个记录的信息就很详细了吧,呵呵。日志
最后,总结一下,想要获取某目录下(好比a目下)b文件的详细信息,咱们应该怎样作?
首先,咱们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。
接着,咱们调用readdir( c)函数读取目录a下全部文件(包括目录),返回指向目录a下全部文件的dirent结构体d。
而后,咱们遍历d,调用stat(d->name,stat *e)来获取每一个文件的详细信息,存储在stat结构体e中。
整体就是这样一种逐步细化的过程,在这一过程当中,三种结构体扮演着不一样的角色。
该日志由 Mr.li 于149 天前发表在Linux分类下, 你能够发表评论,并在保留原文地址及做者的状况下引用到你的网站或博客。
转载请注明: Linux下DIR,dirent,stat等结构体详解 | 花巷草弄11号