DIR、dirent、stat结构体详解(转)

  1. 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);
  1. 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结构体中。

  1. 以下为stat结构体的定义:
struct stat {
         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_t     st_atime;      	//最后一次访问该文件的时间
         time_t     st_mtime;      	//最后一次修改该文件的时间
         time_t     st_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中。

在这一过程中,三种结构体扮演着不同的角色。

  • 12
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值