FilePulse 是一个正在构建中的 Everything-like Windows 桌面文件搜索工具。
它不是简单地递归遍历目录,而是尝试走更接近 Everything 的路线:读取 NTFS 文件系统自己的元数据建立索引,用 USN Journal 增量同步变化,并把索引快照持久化到本地。
目标:将 FilePulse 打造成一个轻量、快速、可研究、可扩展的本地文件搜索器,让 Rust + Tauri 成为桌面效率工具的漂亮样板。
📖 项目博客:CSDN博客链接
- 接近 Everything 的底层方向:使用 NTFS MFT / USN Journal,而不是只靠普通目录遍历。
- Rust 后端:索引、路径重建、快照、增量变更合并都放在 Rust 核心里,利于性能和可靠性。
- Tauri 桌面端:比传统 Electron 更轻,前端仍然保留 React + TypeScript 的开发体验。
- 启动后可加载快照:索引完成后保存到本地,下次打开应用可以直接恢复搜索状态。
- 适合学习 Windows 文件系统索引:代码里能看到 MFT 枚举、USN Journal、路径树重建这些真实工程问题。
| 能力 | 状态 | 说明 |
|---|---|---|
| 选择本地 NTFS 卷 | 已实现 | 支持 C:\、D:\、F:\ 这类本地固定 NTFS 卷 |
| MFT/USN 建立索引 | 已实现 | 通过 FSCTL_ENUM_USN_DATA 枚举卷内文件记录 |
| 文件名/路径搜索 | 已实现 | 大小写不敏感,默认最多返回 500 条结果 |
| 索引快照 | 已实现 | 使用 serde + bincode 保存到本地 app data |
| 启动加载快照 | 已实现 | 应用启动时尝试加载上次选择卷的快照 |
| USN 增量同步 | 已实现 | 通过 FSCTL_READ_USN_JOURNAL 自动追读增量变更 |
| 打开/定位文件 | 已实现 | 调用 Tauri opener 插件 |
| 后台监听变化 | 已实现 | 应用运行期间每秒追读 USN Journal,并向前端推送更新事件 |
| Windows Service | 计划中 | 当前 MVP 推荐管理员权限运行 |
| 文件大小补全 | 计划中 | 当前 MFT/USN 路径中文件大小显示为“未知” |
传统 MVP 文件搜索通常是:
选择目录 -> walkdir 递归扫描 -> Vec<FileEntry> -> 搜索
这个项目现在走的是更底层的卷级索引路线:
选择 NTFS 卷
-> 打开 \\.\F: 卷句柄
-> 查询 USN Journal 状态
-> FSCTL_ENUM_USN_DATA 枚举 MFT/USN 记录
-> 根据 file_ref / parent_ref 重建完整路径
-> 建立内存索引
-> 保存二进制快照
-> 下次启动加载快照
-> 后台持续追读 USN Journal 增量变化
核心区别是:文件系统本身已经维护了一套文件记录和变化日志,我们尽量利用它,而不是每次都从目录树重新走一遍。
flowchart LR
UI["React / TypeScript UI"] --> Commands["Tauri Commands"]
Commands --> Index["Rust SearchIndex"]
Commands --> NTFS["Windows NTFS API"]
Commands --> Storage["Snapshot Storage"]
NTFS --> MFT["FSCTL_ENUM_USN_DATA"]
NTFS --> USN["FSCTL_READ_USN_JOURNAL"]
MFT --> Index
USN --> Index
Index --> Storage
Storage --> Index
Index --> UI
src-tauri/src/core/windows_ntfs.rs # 卷枚举、MFT 枚举、USN 读取
src-tauri/src/core/index.rs # 内存索引、路径重建、增量变更合并
src-tauri/src/core/storage.rs # 索引快照保存和加载
src-tauri/src/core/search.rs # 搜索匹配、排序、结果限制
src-tauri/src/monitor.rs # 后台监听、退避重试、快照节流与事件推送
src-tauri/src/commands.rs # Tauri 命令入口
src/App.tsx # 桌面 UI
- 桌面框架:Tauri v2
- 前端:React 19 + TypeScript + Vite
- 后端:Rust
- Windows API:
windows-sys - 索引来源:NTFS MFT / USN Journal
- 快照格式:
serde+bincode - 包管理:pnpm
需要:
- Windows
- Node.js LTS
- pnpm
- Rust stable MSVC
- Microsoft C++ Build Tools,包含 “Desktop development with C++”
- Microsoft Edge WebView2 Runtime
建议确认 Rust 使用 MSVC 工具链:
rustup default stable-msvccd F:\MyProject\myeverthing\FilePulse
pnpm installMFT/USN 读取卷通常需要管理员权限。建议用“以管理员身份运行”的 PowerShell 启动:
pnpm tauri dev如果只启动前端页面:
pnpm dev完整功能必须通过 pnpm tauri dev 启动,因为索引、搜索和 USN 同步都依赖 Tauri 后端。
- 启动应用。
- 在顶部下拉框选择一个本地 NTFS 卷。
- 点击“建立索引”。
- 在搜索框输入文件名或路径关键词。
- 文件新增、删除、重命名后,后台监听会自动刷新索引和当前搜索结果。
- 关闭应用后,下次启动会尝试自动加载上次保存的索引快照。
前端构建:
pnpm buildRust 测试:
cd src-tauri
cargo testTauri 开发启动:
pnpm tauri devMFT/USN 需要打开卷句柄,例如:
\\.\F:
如果提示权限不足,请用管理员 PowerShell 启动:
pnpm tauri dev如果应用提示 USN Journal 已失效或记录已被清理,需要点击“重建索引”。这表示系统已经清理了应用上次快照之后所需的 USN 记录,无法保证增量同步完整性。
当前 MFT/USN 索引版本优先实现文件名、路径和目录结构搜索。USN 记录不直接提供普通文件大小,所以 MVP 中文件大小显示为“未知”。后续可以对可见结果做异步 metadata 补全。
- Tauri + React + Rust 桌面应用骨架
- 中文搜索 UI
- 本地 NTFS 卷选择
- MFT/USN 初次索引
- 索引快照保存和启动加载
- 手动 USN Journal 同步
- 应用运行期间后台同步 USN Journal
- 可见结果异步补全文件大小、修改时间等 metadata
- Windows Service,避免每次手动管理员启动
- 更丰富的查询语法:
ext:、path:、is:dir、regex: - 虚拟列表,支撑百万级结果滚动
- 托盘、全局快捷键、开机启动
- 打包发布 Windows 安装包
- 只支持 Windows。
- MVP 主路径只支持本地 NTFS 卷。
- 当前没有 Windows Service,建议管理员权限运行。
- 后台监听仅在应用进程运行期间生效,关闭应用后不会作为 Windows Service 常驻。
- 文件大小暂未从普通 metadata 补全。
- 这是学习型和实验型项目,距离完整替代 Everything 还有距离。
如果你也对这些方向感兴趣,欢迎 Star、Fork 或提交改进建议。
