1. dirent --- 用来表示某文件夹的目录内容。
我猜是directory content 的缩写.
dirent 定义于 /include/bits/dirent.h 中:
[cpp] view plain copy print ?
- struct dirent
- {
- #ifndef __USE_FILE_OFFSET64
- __ino_t d_ino;
- __off_t d_off;
- #else
- __ino64_t d_ino;
- __off64_t d_off;
- #endif
- unsigned short int d_reclen;
- unsigned char d_type;
- char d_name[256];
- };
-
- #ifdef __USE_LARGEFILE64
- struct dirent64
- {
- __ino64_t d_ino;
- __off64_t d_off;
- unsigned short int d_reclen;
- unsigned char d_type;
- char d_name[256];
- };
- #endif
可以看出64位的位宽和32位的位宽,定义有所区别,但是表示的内容还是一样的。
d_ino --- inode number 索引节点号.
d_off --- offset to this dirent 在目录文件中的偏移.
d_reclen --- length of this d_name 文件名长.
d_type --- the type of d_name 文件类型.
d_name[256] --- file name (null-terminated) 文件名
2. DIR 结构体
[cpp] view plain copy print ?
- 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;
*__fd
:'struct hurd_fd' pointer for descriptor.
*__data :Directory block.
__entry_data :Entry number `ponds to.
*__ptr :Current pointer into the block.
__allocation :Space allocated for the block.
__size :Total valid data in the block.
(, __lock) :Mutex lock for this structure.
DIR结构体类似于FILE,是一个内部结构. 关于DIR结构体的内容,我们知道这么多就可以了,没必要去再去研究他的结构成员。
以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息.
3. 几个 dirent, DIR相关的常用函数 opendir(),readdir(),closedir() 等.
函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:
[cpp] view plain copy print ?
- struct dirent *readdir(DIR *dp);
-
- void rewinddir(DIR *dp);
-
- int closedir(DIR *dp);
-
- long telldir(DIR *dp);
-
- void seekdir(DIR *dp,long loc);
4. 实例代码:列出某目录下所有文件夹功能。
[cpp] view plain copy print ?
-
-
-
-
-
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/types.h>
- #include <dirent.h>
-
- #ifndef DT_DIR
- #error "DT_DIR not defined, maybe d_type not a mumber of struct dirent!"
- #endif
-
- int main(int argc, char*argv[])
- {
- static char dot[] =".", dotdot[] ="..";
- const char *name;
- DIR *dirp;
- struct dirent *dp;
-
- if (argc == 2)
- name = argv[1];
- else
- name = dot;
- printf(" the request dir name is %s\n", name);
-
-
-
-
- dirp = opendir(name);
- if (dirp == NULL) {
- fprintf(stderr, "%s: opendir(): %s: %s\n",
- argv[0], name, strerror(errno));
- exit(errno);
- } else {
- printf("opendir %s succeed!\n", name);
- }
-
-
-
-
-
- while ((dp = readdir(dirp)) != NULL) {
-
- if (dp->d_type == DT_DIR)
-
- if ( strcmp(dp->d_name, dot)
- && strcmp(dp->d_name, dotdot) )
- printf("%s/\n", dp->d_name);
- }
-
-
- closedir(dirp);
- return (0);
- }
5. 最后,总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做
首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。
接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。
总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。