全国咨询/投诉热线:400-618-9090

首页技术文章正文

Linux 文件目录树的遍历

更新时间:2017-11-16 来源:黑马程序员 浏览量:

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->d_name, "..")) {

15. continue;

16. }

17.

18. sprintf(fullpath, "%s/%s", dir_name, dir->d_name); //获取全局路径

19. printf("%s\n", fullpath); // 打印路径

20. if(lstat(fullpath, &st) < 0) {

21. perror("lstat");

22. continue;

23. }

24. if(S_ISDIR(st.st_mode)) {

25. dir_traverse(fullpath); // 递归遍历子目录

26. }

27.

28. }

29.

30. closedir(dirp);

31.

32. return 0;

33. }

访问目录下某个文件时,需要逐个读取目录数据中的目录项并与目标进行匹配获得文件的inode号,假设文件的平均长度为10byte,加上inode、type及reclen等信息,每个目录项的平均长度为16byte,假设采用4K的数据块,则一个块可以存放256个目录项,按照ext2文件数据索引的方式,当目录下文件数n少于256*12时,则在目录下查找文件最多需要访问n/256(向上取整)个数据块,当目录下文件数更多的时候,需要访问的块数会更快的增加(后面得到存储数据的物理块号需要多级索引),这也是在目录下不应放太多文件的原因,如果将拥有很多文件的目录均分成多个子目录,多一级目录会多一次(或多次,具体依赖于子目录下文件数量)磁盘块访问,但在子目录中查找文件的磁盘访问开销会小很多。

友情提示:获得更多学科学习视频+资料+源码,请加QQ:3276250747。


本文版权归黑马程序员C/C++学院所有,欢迎转载,转载请注明作者出处。谢谢!


作者:黑马程序员C/C++培训学院


首发:http://c.itheima.com/


javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

http://www.itcast.cn/subject/uizly/index.shtml?seozxuids

14天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

8天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

0天免费试学

基础班入门课程限时免费

申请试学名额

12天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

10天免费试学

基础班入门课程限时免费

申请试学名额
在线咨询 我要报名