首先谈一下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) -
}; -
- typedef
struct __dirstream DIR;
DIR结构体类似于FILE,是一个内部结构,函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向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结构体的定义:
- struct
dirent - {
- long
d_ino; -
-
off_t d_off; -
-
unsigned short d_reclen; -
-
unsigned char d_type; -
-
char d_name [NAME_MAX+1]; - }
从上述定义也能够看出来,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_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; //该文件所占的磁盘块 -
-
};