问题描述

为什么不先找遍文件,再找文件夹?

如上图所示,d.c文件查询完后,我认为继续查询文件list.c,而不是进入文件夹demo         

附上深度目录查询代码

int SearchDepth( const char * Path , P_Node head  )
{int count = 0 ;char TmpPath [257] = {0} ;// 打开目录文件DIR * fp = opendir( Path );if ( NULL == fp ){// perror("open dir error");fprintf( stderr , "open dir : %s error:%s\n" , Path , strerror(errno) );return -1 ;}while(1){// 读取目录项struct dirent * dir = readdir( fp );if (NULL == dir ){perror("read dir error");break ;}bzero(TmpPath , 257); // 清空临时数组中的内容避免出现误会if (dir->d_name[0] == '.') // 如果文件名字以 . 开头的则为隐藏文件, 选择直接忽略{continue;}else if ( dir->d_type == 4 ) // 检查是否为目录文件{// 把当前的路劲以及该目录文件的名字进行拼接作为递归下一个目录的完整路径snprintf( TmpPath , 257  ,  "%s/%s" ,Path , dir->d_name  );/* 递归调用自己*/count += SearchDepth( TmpPath , head );}else if ( dir->d_type == 8 ){snprintf( TmpPath , 257  ,  "%s/%s" ,Path , dir->d_name  );printf("遍历寻找到普通文件:%s\n" , TmpPath);char * tmp = strrchr( dir->d_name , '.' ); // 在字符串 dir->d_name 找最后一个 . 的出现if ( tmp ==  NULL ) // 当 tmp 指向NULL 的时候说明该文件路径名中没有出现后缀名{continue; }// 用新的文件名等信息创建一个新的节点P_Node new = InitList(  TmpPath , *(tmp+1)  ); // .jpg  .bmp .mp3 .avi ...// 把新节点插入到链表中Add2List( head , new );count ++ ;}}// 关闭目录文件    closedir(fp);return count ;
}

原因分析:

与目录下文件排列顺序有关

深度目录查询的关键

1.readdir()查询成功返回下个目录进入点

2.根据dir->d_type的不同来区分是目录还是文件

当dir是目录时,dir->d_type = 4

当dir是文件时,dir->d_type = 8

根据d_type不同,判断是否递归查询自己

(dir指针指向读取文件的结构体)


解决方案:

直接把读取文件的结构体打印出来

printf( "Inod:%ld Off:%ld Reclen:%hd Type:%d Name:%s\n",dir->d_ino , dir->d_off , dir->d_reclen , dir->d_type , dir->d_name);

readdir()是按文件偏移量来读取的,off为1、2是隐藏文件。

本例中,读到文件d.c后,下一个读文件夹demo,进入文件夹后再按文件偏移量来读取,读完文件夹demo中的文件后,输出read dir error: Success , 再从根目录下一个off读文件。


什么是"当前文件偏移量"?

每当打开一个文件都有一个"当前文件偏移量"(current file offset). 它通常是非负整数,用以度量从文件开始处计算的字节数.通常,读,写操作都是从当前文件偏移量开始,并使偏移量增加所读写的字节数.按照系统默认情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0.

参考链接:https://blog.csdn.net/weixin_45030544/article/details/115326371

Linux深度目录查询 readdir() inode含义的解析相关推荐

  1. linux c readdir 顺序,Linux读取目录函数readdir以及inode结构简介

    readdir 语法: struct dirent* readdir(DIR* dir_handle); 返回值: dirent结构 函数种类: 文件存取 内容说明 本函数用来读取目录.返回目录中的文 ...

  2. Linux下目录/文件颜色的含义

    在显示的每一行中: 第1段为文件类型和权限 第2段为节点数(i-node) 第3段为所有者 第4段为所属群组 第5段为文件大小,单位为字节(用 ls -lh会显示的更加人性化) 第6段为最后修改时间( ...

  3. Linux中的 “~” 和 “/”符号代表含义?

    题目 Linux中的 "~" 和 "/"符号代表含义? 解析 首先对于root用户: "~" 表示的是root用户的目录,可以理解为每个用户 ...

  4. linux修改目录block信息,linux下文件操作inode,block的变化

    在"浅谈linux性能调优之三:分区格式化之前的考虑" http://my.oschina.net/sharelinux/blog/143522    一文中我说了inode与bl ...

  5. Linux五部分的含义,Linux 目录下部分重要目录的用途及含义及一些命令的作用

    Linux根目录下部分重要目录的用途及含义 /proc:这个目录是系统内存的映射,我们可以直接访问这个目录来获取系统信息.也就是说,这个目录的内容不在硬盘上而是在内存里. /sys:系统 (syste ...

  6. linux下目录的个个文件夹含义

    inyiwin xp下三个目录 drivers(家) Program File windos linux下目录 bin 存放二进制文件(system32) boot 系统启动文件,内核 dev 设备文 ...

  7. Linux locate模糊查询,linux命令: 两个查找工具 locate,find(示例代码)

    linux 中有很多查找工具,今天主要讲解locate,find两个工具. 1.locate (1)查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 注意:如果这 ...

  8. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解和Linux系统各个目录的作用 标签: linuxtcpfunctionclassfirefoxtimer 2012-01-11 23:08 45517人阅读 评论(2) ...

  9. EduCoder Linux文件/目录高级管理二

    本实训主要讲解Linux中一个文件/目录是如何在磁盘中存放的,Linux将一个磁盘划分为不同的分区,每个分区可以有不同的格式,Linux用的系统格式有ext2.ext3和ext4. Linux能够识别 ...

最新文章

  1. java---编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得。
  2. Photoshop自由变换图形大小
  3. php 筛选数组,php数组如何按照字段筛选
  4. php类实例化js,php中如何实例化一个类_后端开发
  5. MIT软件构造 -- ADT Patterns: Interfaces, Generics, and Enums
  6. 【C++】 54_被遗弃的多重继承 (下)
  7. Unreal Engine 4 —— 适用于FPS游戏的勾边后期效果
  8. unity 的Cinemachine组件运用
  9. 测试人员的系统性思维
  10. java map操作_Java HashMap的基本操作
  11. JS中var、let、const区别? 用3句话概括
  12. I.MX6 MAC地址修改
  13. 010,spring boot 文件上传
  14. 得到app文稿导出_得到APP使用报告
  15. 企业微信h5开发(即JS-SDK),一不小心,就会掉进坑,进入死胡同
  16. C语言基本的窗口开发
  17. 【大咖周刊】Linus 在谷歌介绍 Git、IBM340亿收购小红帽、IDE Visual Studio 开始支持 Java 了...
  18. win7文件和文件夹可以重名吗_怎么取消WIN7复制同名文件自动重命名
  19. [Matlab] 单次测量的中误差、算数平均值的中误差、加权求最或然值、函数拟合、莫迪图的计算实例
  20. 可恶的零宽空格—ZWSP

热门文章

  1. 秦殇 二进制txt 异或(h2.exe相关)
  2. java inputstream子类_Java InputStream 类
  3. python爬取百度翻译视频_利用python爬取百度翻译内容
  4. 根据淘宝商品ID免费获取商品详细信息(实时价格、尺码、库存等) 超详细
  5. ERR Client sent AUTH, but no password is set. channel: [id: 0xfca52a0c, L:/1
  6. the eleventh hour 最后时刻
  7. 杭电acm题目分类 非常详细
  8. 瑜伽普拉提小程序系统升级改造方案分享
  9. Page 标签的 CodeBehind, CodeFile, Inherits 的理解
  10. NetworkX的基本用法