博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux文件遍历
阅读量:4140 次
发布时间:2019-05-25

本文共 1238 字,大约阅读时间需要 4 分钟。

1.  linux提供opendirreaddir(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.     struct stat st;
  9.     struct dirent *dir;
  10.     char fullpath[FILENM_MAX];
  11.     while((dir = readdir(dirp)) != NULL) {
  12.         if(!strcmp(dir->d_name, ".") || // 考虑当前目录和上级目录,否则会死循环
  13.            !strcmp(dir->d_name, "..")) {
  14.             continue;
  15.         }
  16.         sprintf(fullpath, "%s/%s", dir_name, dir->d_name); //获取全局路径
  17.         printf("%s\n", fullpath); // 打印路径
  18.         if(lstat(fullpath, &st) < 0) {
  19.             perror("lstat");
  20.             continue;
  21.         }
  22.         if(S_ISDIR(st.st_mode)) {
  23.             dir_traverse(fullpath); // 递归遍历子目录
  24.         }
  25.     }
  26.     closedir(dirp);
  27.     return 0;
  28. }

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

转载地址:http://xlhvi.baihongyu.com/

你可能感兴趣的文章
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>