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。

linux下循环读取目录文件,Linux 文件目录树的遍历相关推荐

  1. linux下循环读取目录文件,linux循环递归读取目录指定类型文件及计算阶乘脚本...

    linux循环读取目录指定类型文件脚本 ergodic.sh #!/bin/bash function ergodic { for file in ` ls $1` do if [ -d $1&quo ...

  2. linux下怎么批量命名文件,linux下的文件操作——批量重命名

    概述:在日常工作中,我们经常需要对一批文件进行重命名操作,例如将所有的jpg文件改成bnp,将名字中的1改成one,等等.文本主要为你讲解如何实现这些操作 1.删除所有的 .bak 后缀: renam ...

  3. Linux文件属性4——读取目录文件

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.opendir与readdir函数 (1)opendir打开一个目录后,得到一个DIR类型的指针给readdi ...

  4. linux 下写不了文件,linux下用root为什么写不了windows下的文件

    windows和Linux双系统怎样安装 毫无疑问,Windows是一个功能强大的操作系统,无论在兼容性方面,还是在易用性方面,都非常出色,但您有没有注意到市场上悄然兴起的Linux呢?作为一款出色的 ...

  5. linux下搜狗安装目录,搜狗输入法Linux版配置文件详解

    sogoupinyin–搜狗输入法linux版,是linux下比较好用的一款中文输入法,和win下面的搜狗输入法一样好用~. 官网地址:http://pinyin.sogou.com/linux/. ...

  6. linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件

    搜索热词 以下实例本人在Centos6.5 64位操作系统中使用 一.定时复制文件 a.在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件 #将tomcat中 ...

  7. linux下github上传文件,linux下将本地文件上传到github中?

    今天编写一份Python基础代码,经过Linux上传到github上,遇到点问题,已经解决 1.首先sudo su 进入root 用户 2.ls 检查出当前文件下有什么文件 3. cd 进入你将要上传 ...

  8. 在linux下怎么建立sh文件,Linux系统下如何运行.sh文件的实现

    在Linux系统下运行.sh文件有两种方法,比如我在root目录下有个datelog.sh文件 第一种(这种办法需要用chmod使得文件具备执行条件(x): chmod u+x datelog.sh) ...

  9. linux下kbhit的头文件,linux下kbhit的实现

    我们知道,在windows下有个键盘测试函数,int kbhit(void).使用该函数需要包含头文件conio.h.执行时,kbhit测试是否有键盘按键按下,若有则返回非零值,否则返回零. 在Uni ...

最新文章

  1. Mybatis源码解读-设计模式总结
  2. Keepalived — VRRP 的 Linux 软件实现
  3. Python编程:Tkinter图形界面设计(1)
  4. cocos2dx vs2010 配置
  5. MVC项目开发中那些用到的知识点(Asp.Net Mvc3.0 Areas)
  6. install scrapy with pip and easy_install
  7. python第十九天(random、json、pickle、hashlib、hmac、shutil、shevle模块)
  8. ddr3服务器内存条维修,详解服务器中内存故障的优质解决方案
  9. JS、Java、C 依然强势,Go、Kotlin、Python 成为潜力股,2020 开发者生态系统报告揭晓!...
  10. AcWing 836. 合并集合
  11. 接收二进制数据_漫话TCP/IP:数据链路层-以太网(1)
  12. Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(一)前期准备
  13. uni-app使用小图标的方式
  14. 虚拟摄像头API对比pyfakewebcam与pyvirtualcam
  15. html打开txt文件 乱码怎么解决,txt文件打开显示乱码怎么办?
  16. Java SE 基础部分经典100道笔试题
  17. 在产品中,我们常说的A端/B端/C端是什么?
  18. 3dMax 入门(高脚杯)
  19. 天价月饼被套上“紧箍咒”,499元成天花板?
  20. 直接插入排序算法视频

热门文章

  1. 阿里云产品经理刘宇:Serverless 的前世今生
  2. php 手机号机主姓名实名验证接口
  3. Grafana系列教程–Grafana基本概念
  4. 移植flash游戏到android
  5. LocalCache本地缓存分享
  6. 英特尔推出全新 NUC 套件和 NUC Mini PC
  7. QCM学习—基于QT自制上位机(多线程)
  8. 微信开发者导入微信小程序项目
  9. Docker配置了国内镜像仍然无法下载镜像
  10. Solr的增量更新和全量更新对比