Everything的核心原理是直接读取NTFS文件系统的MFT表和USN日志实现快速索引。在Golang中可通过第三方库操作这些底层结构:
依赖库:
使用github.com/gentlemanautomaton/volmgmt库访问NTFS的MFT表和USN日志。
流程:
获取磁盘卷句柄(volume.New)
读取MFT表(vol.MFT())
遍历USN日志记录(mft.Enumerate)
缓存记录并解析文件路径(usn.Cache)
package main
import (
"context"
"fmt"
"github.com/gentlemanautomaton/volmgmt/usn"
"github.com/gentlemanautomaton/volmgmt/volume"
)
func FindFileWin(dir string, filename string) []string {
vol, err := volume.New(dir + "\\")
if err != nil {
fmt.Println("获取卷失败:", err)
return nil
}
defer vol.Close()
mft := vol.MFT()
defer mft.Close()
iter, err := mft.Enumerate(nil, usn.Min, usn.Max)
if err != nil {
fmt.Println("遍历MFT失败:", err)
return nil
}
defer iter.Close()
cache := usn.NewCache()
if err := cache.ReadFrom(context.Background(), iter); err != nil {
return nil
}
records := cache.Records()
for i, record := range records {
//fmt.Printf("%d 文件名: %s, 路径: %s\n", i, record.FileName, record.Path)
if record.FileName == filename {
fmt.Printf("%d 文件名: %s, 路径: %s\n", i, record.FileName, record.Path)
}
}
fmt.Println(len(records))
return nil
}
func main() {
FindFileWin("E:\\", "test.txt")
}