1. linux提供opendir、readdir(readdir_r)、closedir和scandir等接口实现对目录的读取。
2. readdir返回指向下一个目录项的指针,如果要自己传入缓冲区存储目录项,应使用readdir_r代替。readdir的结果中包含当前目录和上一级目录的目录项信息。
3. 在遍历过程中,进程的工作目录不会改变,在递归遍历的时候,需要改变工作目录(chdir)以识别相对路径,或者每次都限定全局路径。
4. 深度优先遍历目录树采用递归实现易编码(参见如下代码),广度优先遍历则需借助队列实现。当目录下的文件数量较少时,采用广度优先遍历效率会更高,因目录下的目录项基本都是连续存放,减少了很多磁盘寻道;而采用深度优先遍历,结果的聚合性更高。
1. int dir_traverse(const char *dir_name)
2. {
3. DIR *dirp = opendir(dir_name);
4. if(!dirp) {
5. perror("opendir");
6. return -1;
7. }
8.
9. struct stat st;
10. struct dirent *dir;
11. char fullpath[FILENM_MAX];
12. while((dir = readdir(dirp)) != NULL) {
13. if(!strcmp(dir->d_name, ".") || // 考虑当前目录和上级目录,否则会死循环
14. !strcmp(dir->