写在前面

使用了Everything之后,一直对他的搜索速度感兴趣,在网上也看了很多对其原理的揭秘,终于有空找了个源码研究了一下,原理就是对NTFS的USN特性进行使用。

原理

详细解释我参照别人家的博客来一段:

当扇区的文件有变化时,操作系统会往USN Journal文件中追加一条记录,该记录包含文件名、变化发生的时间、变化的原因等信息,而不包含变化的内容。每一条记录用一个64位数字标识,称作USN(UpdateSequence Number)。微软用每一条记录在日志文件中的偏移作为该记录的USN,这样可以快速地通过USN获取到对应的记录。显而易见,USN是递增的,但是不连续。

所以如果想获得磁盘的文件只需要读取日志即可。

网上的源码有很多,关于读取日志,从日志转换成完整路径都不难理解,如果想自己写一个也是可以的。

问题

我认为需要考虑的主要问题:
1. 从上次读取的位置继续读取;
2. 新增或删除文件处理。

Everything 源码超级简述

源码仔细看并不难理解。
UsnOperator 类中,我认为比较重要的一点,是如何继续读取

public List<UsnEntry> GetEntries()
{var result = new List<UsnEntry>();UsnErrorCode usnErrorCode = this.QueryUSNJournal();if (usnErrorCode == UsnErrorCode.SUCCESS){MFT_ENUM_DATA mftEnumData = new MFT_ENUM_DATA();mftEnumData.StartFileReferenceNumber = 0;// 如果想从上次的位置继续读取日志// 将lowUsn修改至上次最后一个UsnEntry.Usn即可mftEnumData.LowUsn = 0;mftEnumData.HighUsn = this.ntfsUsnJournalData.NextUsn;int sizeMftEnumData = Marshal.SizeOf(mftEnumData);IntPtr ptrMftEnumData = GetHeapGlobalPtr(sizeMftEnumData);Marshal.StructureToPtr(mftEnumData, ptrMftEnumData, true);int ptrDataSize = sizeof(UInt64) + 10000;IntPtr ptrData = GetHeapGlobalPtr(ptrDataSize);uint outBytesCount;while (false != Win32Api.DeviceIoControl(this.DriveRootHandle,UsnControlCode.FSCTL_ENUM_USN_DATA,ptrMftEnumData,sizeMftEnumData,ptrData,ptrDataSize,out outBytesCount,IntPtr.Zero)){IntPtr ptrUsnRecord = new IntPtr(ptrData.ToInt32() + sizeof(Int64));while (outBytesCount > 60){var usnRecord = new USN_RECORD_V2(ptrUsnRecord);result.Add(new UsnEntry(usnRecord));ptrUsnRecord = new IntPtr(ptrUsnRecord.ToInt32() + usnRecord.RecordLength);outBytesCount -= usnRecord.RecordLength;}Marshal.WriteInt64(ptrMftEnumData, Marshal.ReadInt64(ptrData, 0));}Marshal.FreeHGlobal(ptrData);Marshal.FreeHGlobal(ptrMftEnumData);}return result;
}

使用 FileSystemWatcher 监听文件变化

关于电脑文件的修改监听,C#有相应的类来处理,非常方便,感兴趣可深挖:

FileSystemWatcher _watcher = new FileSystemWatcher(@"J:\", "*.*");
_watcher.Created += new FileSystemEventHandler(OnProcess);
_watcher.Changed += new FileSystemEventHandler(OnProcess);
_watcher.Deleted += new FileSystemEventHandler(OnProcess);
_watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
_watcher.IncludeSubdirectories = true;
_watcher.EnableRaisingEvents = true;

下载

Everything相关资料下载

参考资料

DeviceIOControl详解-各个击破

Everything是如何搜索的相关推荐

  1. VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、

    1. 生成配置参数 对于大多数的调试都需要在当前项目目录下创建一个 lanch.json 文件,位置是在当前项目目录下生成一个 .vscode 的隐藏文件夹,在里面放置一些配置内容,比如:settin ...

  2. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则

    1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...

  3. Windows10自带搜索增强设置

    操作系统:Windows10 前言:Windows自带的搜索速度非常慢,因此有人借助Everything等索引软件进行搜索,能够显著提升搜索速度.但是Windows自带的搜索在进行一些设置以后也能达到 ...

  4. listary 指定目录搜索_everything

    20211009 https://zhuanlan.zhihu.com/p/225414423 listary详细使用 20210710 everything搜索文件,结果出现相同的2个重复情况,路径 ...

  5. LeetCode简单题之二叉搜索树中的搜索

    题目 给定二叉搜索树(BST)的根节点 root 和一个整数值 val. 你需要在 BST 中找到节点值等于 val 的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 null . 示例 1 ...

  6. Hexo集成Algolia实现搜索功能

    2年前搭建的hexo博客好久没有维护了,一看 hexo 以及先前使用 butterfly 主题已经更新好几个版本了,看介绍在速度性能上有了很大的提高,于是打算给 hexo 升个级,整理整理翻翻新.通过 ...

  7. 目标识别的选择性搜索

    目标识别的选择性搜索 Selective Search for Object Recognition 论文地址: https://ivi.fnwi.uva.nl/isis/publications/b ...

  8. 2021年大数据ELK(四):Lucene的美文搜索案例

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 美文搜索案例 一.需求 二.准备工作 1.创建IDEA项目 2. ...

  9. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

  10. [C] 层层递进——C语言实现广度优先搜索

    以防万一有人想不开要做染色的题呢?比如我. 广度优先搜索 如何实现一个广度优先搜索 广搜(bfs)是一个层层递进的概念,与深搜的不撞南墙不回头不同,广搜更像一个感染的过程,一个点只能感染到它周边的点. ...

最新文章

  1. yarn timeline1,timeline2官网解释
  2. 算法——海量数据(5%)
  3. Mybatis-plus 思维导图,让 Mybatis-plus 不再难懂
  4. 关于用display:table让元素居中的小结
  5. 第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)
  6. 如何解决anaconda出现CondaHTTPError问题
  7. java webdriver page object_Selenium2(java)页面对象模型(Page Object) 八
  8. 瞧瞧,这样的代码才叫 Pythonic
  9. XUtils BitmapUtils 改造以加入drawable支持
  10. 【空间统计入门】笔记—空间关系和空间权重矩阵
  11. linux内核异常解析,内核异常分析方法
  12. 蓝牙协议栈HCI EIR(EXTENDED INQUIRY RESPONSE)扩展搜索响应
  13. 2022年Google SEO基础知识,技术搜索引擎优化介绍
  14. android电视视频播放器,智能电视如何播放本地视频?当贝市场分享几款播放器...
  15. FBX导入Unity中模型没有材质的处理
  16. linux解压zip、tar压缩包
  17. CrashReport
  18. 《中国聚合支付行业发展报告2018》发布 深度分析未来八大趋势
  19. 单相整流及三相整流电路分析-包括整流桥及电容选择计算
  20. C语言火焰图,Python程序性能分析和火焰图

热门文章

  1. Angular实现dialog对话框封装
  2. 采用递归求第n位数【C#】
  3. 转:6.1海量数据处理
  4. 二分查找和二叉查找树
  5. JAVA通过SSL证书创建MS AD账户及设置密码
  6. intellij idea 最常用的快捷键
  7. Spring的基本使用
  8. 如何查看SQL Server2000执行过的SQL语句
  9. Android 获取CellId以及IMEI 获取基站id
  10. diff git 代码实现_Git 自救指南:这些坑你都跳得出吗?