(摘) 访问NTFS的MFT表和USN日志实现搜索文件

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

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")
}

相关文章