Everything是如何搜索的
寫在前面
使用了Everything之后,一直對(duì)他的搜索速度感興趣,在網(wǎng)上也看了很多對(duì)其原理的揭秘,終于有空找了個(gè)源碼研究了一下,原理就是對(duì)NTFS的USN特性進(jìn)行使用。
原理
詳細(xì)解釋我參照別人家的博客來(lái)一段:
當(dāng)扇區(qū)的文件有變化時(shí),操作系統(tǒng)會(huì)往USN Journal文件中追加一條記錄,該記錄包含文件名、變化發(fā)生的時(shí)間、變化的原因等信息,而不包含變化的內(nèi)容。每一條記錄用一個(gè)64位數(shù)字標(biāo)識(shí),稱作USN(UpdateSequence Number)。微軟用每一條記錄在日志文件中的偏移作為該記錄的USN,這樣可以快速地通過(guò)USN獲取到對(duì)應(yīng)的記錄。顯而易見(jiàn),USN是遞增的,但是不連續(xù)。
所以如果想獲得磁盤的文件只需要讀取日志即可。
網(wǎng)上的源碼有很多,關(guān)于讀取日志,從日志轉(zhuǎn)換成完整路徑都不難理解,如果想自己寫一個(gè)也是可以的。
問(wèn)題
我認(rèn)為需要考慮的主要問(wèn)題:
1. 從上次讀取的位置繼續(xù)讀取;
2. 新增或刪除文件處理。
Everything 源碼超級(jí)簡(jiǎn)述
源碼仔細(xì)看并不難理解。
UsnOperator 類中,我認(rèn)為比較重要的一點(diǎn),是如何繼續(xù)讀取
使用 FileSystemWatcher 監(jiān)聽(tīng)文件變化
關(guān)于電腦文件的修改監(jiān)聽(tīng),C#有相應(yīng)的類來(lái)處理,非常方便,感興趣可深挖:
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相關(guān)資料下載
參考資料
DeviceIOControl詳解-各個(gè)擊破
總結(jié)
以上是生活随笔為你收集整理的Everything是如何搜索的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle 创建表 练习题
- 下一篇: 动态类型var和dynamic和传统确定