Everything是如何搜索的
写在前面
使用了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是如何搜索的相关推荐
- VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、
1. 生成配置参数 对于大多数的调试都需要在当前项目目录下创建一个 lanch.json 文件,位置是在当前项目目录下生成一个 .vscode 的隐藏文件夹,在里面放置一些配置内容,比如:settin ...
- 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则
1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...
- Windows10自带搜索增强设置
操作系统:Windows10 前言:Windows自带的搜索速度非常慢,因此有人借助Everything等索引软件进行搜索,能够显著提升搜索速度.但是Windows自带的搜索在进行一些设置以后也能达到 ...
- listary 指定目录搜索_everything
20211009 https://zhuanlan.zhihu.com/p/225414423 listary详细使用 20210710 everything搜索文件,结果出现相同的2个重复情况,路径 ...
- LeetCode简单题之二叉搜索树中的搜索
题目 给定二叉搜索树(BST)的根节点 root 和一个整数值 val. 你需要在 BST 中找到节点值等于 val 的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 null . 示例 1 ...
- Hexo集成Algolia实现搜索功能
2年前搭建的hexo博客好久没有维护了,一看 hexo 以及先前使用 butterfly 主题已经更新好几个版本了,看介绍在速度性能上有了很大的提高,于是打算给 hexo 升个级,整理整理翻翻新.通过 ...
- 目标识别的选择性搜索
目标识别的选择性搜索 Selective Search for Object Recognition 论文地址: https://ivi.fnwi.uva.nl/isis/publications/b ...
- 2021年大数据ELK(四):Lucene的美文搜索案例
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 美文搜索案例 一.需求 二.准备工作 1.创建IDEA项目 2. ...
- [C] 深度优先搜索解决连通块/染色问题——求岛的个数
本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...
- [C] 层层递进——C语言实现广度优先搜索
以防万一有人想不开要做染色的题呢?比如我. 广度优先搜索 如何实现一个广度优先搜索 广搜(bfs)是一个层层递进的概念,与深搜的不撞南墙不回头不同,广搜更像一个感染的过程,一个点只能感染到它周边的点. ...
最新文章
- yarn timeline1,timeline2官网解释
- 算法——海量数据(5%)
- Mybatis-plus 思维导图,让 Mybatis-plus 不再难懂
- 关于用display:table让元素居中的小结
- 第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)
- 如何解决anaconda出现CondaHTTPError问题
- java webdriver page object_Selenium2(java)页面对象模型(Page Object) 八
- 瞧瞧,这样的代码才叫 Pythonic
- XUtils BitmapUtils 改造以加入drawable支持
- 【空间统计入门】笔记—空间关系和空间权重矩阵
- linux内核异常解析,内核异常分析方法
- 蓝牙协议栈HCI EIR(EXTENDED INQUIRY RESPONSE)扩展搜索响应
- 2022年Google SEO基础知识,技术搜索引擎优化介绍
- android电视视频播放器,智能电视如何播放本地视频?当贝市场分享几款播放器...
- FBX导入Unity中模型没有材质的处理
- linux解压zip、tar压缩包
- CrashReport
- 《中国聚合支付行业发展报告2018》发布 深度分析未来八大趋势
- 单相整流及三相整流电路分析-包括整流桥及电容选择计算
- C语言火焰图,Python程序性能分析和火焰图