LINUX下历遍目录的方法一般是这样的
打开目录-》读取-》关闭目录
相关函数是
opendir -> readdir -> closedir
#include <dirent.h>
DIR *opendir(const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
好了,三个函数都出来了,原型就是上面。
opendir用于打开目录,是类似于流的那种方式,返回一个指向DIR结构体的指针,参数*dirname是一个字符数组或者字符串常量;
readdir函数用于读取目录,只有一个参数,就是opendir返回的结构体指针,或者叫句柄更容易理解些吧。这个函数也返回一个结构体指针 dirent *;
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;
dirent的结构如下定义
struct dirent
{
long d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name [NAME_MAX+1];
}
结构体中
- d_ino存放的是该文件的索引节点号inode;
- d_off 是文件在目录中的编移,具体是什么意思也不是很明白,很少用到它,
- 基本上就是用到d_name
- short d_reclen是这个文件的长度,需要注意的是这里的长度并不是指文件大小,因为大小和长度是两回回事了,你可以用lseek将文件长度移得很长,但大小其实还是那么大。
- 最后一个元素就是我们要的了,文件名称。
通过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; //该文件所占的磁盘块 };
这个记录的信息就很详细了吧.
最后,总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?
- 首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。
- 接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
- 然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。
总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。
实例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
void print_usage(void);void print_usage(void)
{printf("Usage: test dirname\n");
}int main(int argc,char *argv[])
{DIR * dp;struct dirent *filename;if (argc < 2){print_usage();exit(1);}dp = opendir(argv[1]);if (!dp){fprintf(stderr,"open directory error\n");return 0;}while (filename = readdir(dp)){printf("filename:%-10s\td_info:%ld\t d_reclen:%us\n",filename->d_name,filename->d_ino,filename->d_reclen);}closedir(dp);return 0;
}
参考
http://blog.csdn.net/zhuyi2654715/article/details/7605051
http://www.cnblogs.com/onlycxue/p/3154341.html