Files

115 lines
9.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WLocate 1.0
Windows x64 原生文件查找工具。`wlocate.exe` 提供 GUI 和后台服务,`locate.exe` 提供命令行;两者共享独立的 C++ 索引。日常搜索无需管理员权限,不依赖 Everything、SwiftList 或 .NET。
两个程序均嵌入 UTF-8 activeCodePage manifest,启动时核验进程代码页为 65001,要求 Windows 10 1903 或更新系统。编译器使用 `/utf-8`;窄字符串、索引、IPC 和重定向文本统一为 UTF-8,在 Windows 窗口、Shell 和 W API 边界转换 UTF-16。它不会更改系统区域设置或父终端代码页。
绿色放大镜图标覆盖 EXE、窗口、任务栏、托盘和开始菜单,包含 16–256 像素共九种尺寸。可编辑矢量稿在 `assets/wlocate.svg`,运行 `tools/Build-Icon.ps1` 可重新生成 ICO。
## 本机安装与使用
- GUI / 服务程序:`C:\Program Files\WLocate\wlocate.exe`。
- 命令行:`D:\tools\bin\locate.exe`;同目录的 `wlocate.exe` 可直接启动界面。
- 开始菜单:WLocate。后台服务:`WLocateService`,自动启动。
- 索引和日志:`C:\ProgramData\WLocate`。界面设置:`%LOCALAPPDATA%\WLocate\settings.ini`。
- 原来的 `locate.old.exe` 保留。此次替换前的 locate 备份路径记录于 `C:\Program Files\WLocate\install-state.json`。
```powershell
locate -n 10 "python*.exe"
locate -i -b python
locate -ic "*.dll"
locate -0 -n 100 "*.cpp"
locate -r '^python.*\.exe$'
locate --query 'ext:exe size:>1mb !path:Windows' --sort size --descending -n 20
locate -S
wlocate "python*.exe"
```
## 已实现的功能
| 部分 | 行为 |
|---|---|
| 建索引 | 自动发现带盘符的本地 NTFS 卷;直接读取 MFT、扩展记录及长文件名硬链接;索引名称、父目录、大小、时间、属性 |
| 实时更新 | USN 日志增量更新,约 250 ms 轮询;创建、删除、改名、移动、硬链接及元数据变化;目录改名不必重写所有后代路径 |
| 持久化 | 原子替换的 SHA-256 校验快照;重启后续读 USN;卷标识或日志缺口不匹配时重建;临时繁忙记录保留旧值并重试 |
| 磁盘变化 | 自动加入新 NTFS 盘、移除拔出的盘;一个卷建索引时仍可查询其他就绪卷 |
| 查询 | Unicode、大小写开关、通配符、PCRE2 JIT 正则、AND/OR/NOT 和分组、常用 Everything 过滤函数 |
| 界面 | 输入即时搜索、类型筛选、名称/完整路径/大小/修改时间/扩展名排序、虚拟列表分页、书签、CSV/文本导出、托盘、自定义全局快捷键、可选登录启动 |
| 文件操作 | 原生 Windows Shell 右键菜单和已安装的扩展;打开、所在文件夹、复制、剪切、删除、属性、重命名、拖出;支持跨目录多选 |
| 命令行 | 服务端限量、计数、NUL 分隔、存在性检查、超时与 Ctrl+C 取消、UTF-8 重定向输出 |
程序自身不提升普通 GUI 的权限。安装服务和重建全盘索引才需要管理员权限;Shell 文件操作遵循当前用户的 Windows 权限和系统确认行为。
## 界面语法
默认忽略大小写、匹配名称。空格为 AND,`|` 为 OR,`!` 为 NOT,`<...>` 分组,双引号包含空格或运算符。
```text
python*.exe
<python | node> ext:exe
"Program Files"
file: ext:cpp;h !path:build
folder: path:D:\work
size:>10mb dm:today
size:1kb..10mb dc:2026-01-01..2026-12-31
attrib:h
case:Python
regex:"^python(?:3)?\.exe$"
```
支持 `file:`、`folder:`、`ext:`、`path:`、`parent:`、`size:`、`dm:`/`datemodified:`、`dc:`/`datecreated:`、`da:`/`dateaccessed:`、`attrib:`/`attributes:`、`case:`、`nocase:`、`regex:`、`ww:`/`wholeword:`。属性字母:`h s r a d l`。日期支持 `YYYY-MM-DD`、`today`、`yesterday`、范围和比较运算;按本地日历边界解释。大小单位使用 1024 倍数。完整路径正则以 `/` 作为路径分隔符。
| 快捷键 | 功能 |
|---|---|
| Ctrl+L / Ctrl+F | 定位搜索框 |
| Ctrl+Alt+L(默认,可修改) | 界面已运行时显示窗口 |
| Enter / Ctrl+Enter / Alt+Enter | 打开 / 所在文件夹 / 属性 |
| Ctrl+C / Ctrl+X / Ctrl+Shift+C | 复制文件 / 剪切文件 / 复制完整路径 |
| F2 / Delete / Shift+Delete | 重命名 / 系统删除 / 系统永久删除 |
| Ctrl+A / F5 | 全选 / 刷新 |
| Ctrl+S / Ctrl+D | 导出全部匹配结果 / 收藏当前查询 |
全局唤出快捷键可在 **工具 → 快捷键设置** 或托盘右键菜单中修改。选择 Ctrl / Alt / Shift / Win 组合与按键,点击“确定”立即生效并保存,下次启动继续使用;也可禁用或恢复默认。新组合被占用、系统不允许注册或设置保存失败时,原快捷键保持可用,窗口内会提示原因。为避免拦截日常输入,普通按键需搭配 Ctrl、Alt 或 Win;功能键可单独使用。程序启动时遇到快捷键冲突会给出托盘提示,仍可通过托盘打开窗口修改。
导出先写临时文件,完成后替换目标;CSV 使用 UTF-8 BOM。界面每两秒刷新;有选中项或正在重命名时暂停自动刷新,以免选中对象移动。搜索框清空可显示全部索引。列宽、窗口大小、查询开关及最多 30 条书签会保存。
## 命令行兼容范围
`locate --help` 列出完整选项。支持 Linux locate 常用参数 `-n/-l`、`-i`、`-b`、`-w`、`-A/-a`、`-c`、`-0`、`-e`、`-E`、`-r`、`--regex`、`-S` 和 `--`。
这是 Windows 索引客户端,不读取 GNU/mlocate/plocate 数据库,未实现 `updatedb`、`--database` 或全部 GNU 扩展。默认区分大小写;普通文字按完整路径子串匹配,未带分隔符的通配符和正则按名称匹配,`-w` 强制匹配完整路径,`-b` 强制名称匹配。多个模式默认 OR,`-A` 改为 AND;`--query` 使用界面语法并默认忽略大小写。正则语法为 PCRE2。
无排序的 `-n` 在后端找到足够条目即停止;结果顺序不保证稳定。需要确定顺序时加 `--sort`。`-c -n 10` 的计数最多为 10。退出码:0 有结果,1 无结果,2 错误,130 被取消。索引尚未全部就绪时可能返回部分结果,同时在 stderr 提示并以 2 退出。
## 编译、安装、回退
使用 MSVC、Windows SDK、CMake 3.25+;本机验证环境为 VS 2026、MSVC 19.50、CMake 4.2.3。依赖源已固定在 `third_party/pcre2`,需要其 SLJIT 子模块。
```powershell
.\Build.ps1
# 以管理员身份运行;在这台电脑可以使用 psuac:
psuac -w powershell.exe -NoProfile -ExecutionPolicy Bypass -File D:\work\gitprojs\swiftlist-locate\wlocate\Install.ps1
```
源码构建输出在 `build\bin\Release`。发布包内可直接运行其 `Install.ps1`,或指定 `-BuildDirectory`;`-CliDirectory` 指定命令行目录,默认 `D:\tools\bin`。`-StageOnly` 仅安装服务端及 Program Files 内的程序,不替换 PATH 中的 locate。更新前先退出 WLocate 界面。
`wlocate --install-service` 在提升权限后会将服务程序安装到 Program Files;不会让 SYSTEM 服务从普通用户可写的工具目录运行。安装目录及数据目录仅允许管理员/SYSTEM 写入。
需要回退命令行时,将 `install-state.json` 中 `previous_locate` 对应的文件复制回 `D:\tools\bin\locate.exe`。原始 Everything 客户端 `D:\tools\bin\locate.old.exe` 也一直保留。需要删除服务时,以管理员运行 `"C:\Program Files\WLocate\wlocate.exe" --uninstall-service`。此操作保留索引、用户设置和二进制文件,便于重新安装。
## 验证与性能
`tests/tests.cpp` 覆盖查询语法、Unicode、范围、正则边界、硬链接、路径/分页排序、取消、元数据缓存、MFT 解析、校验快照、压缩及部分卷可用。
`tests/integration.py` 使用工作区内独立 UUID 目录测试实时更新、30 个硬链接跨 MFT 扩展记录、Unicode 长路径、500 文件突发创建、元数据和清理。`tests/protocol.py` 测试畸形请求、60 次并发查询、2 万条输出、超时及未提升权限的重建拒绝。`tests/restart.ps1` 和 `tests/hotplug.ps1` 需要管理员权限;后者只格式化自己新建的临时 VHD,不选择物理磁盘。`wlocate_ui_tests.exe` 创建自己的窗口和测试文件,验证筛选、虚拟列表、跨目录原生菜单及 Unicode 重命名,并保存渲染图。
性能数据与测量口径见 `PERFORMANCE.md`,原始记录在源码目录的 `test-output`。旧版包装器不支持 `-n`;本次 `*.exe` 对比中旧版仅输出 9999 条,而原生版找到 12286 条,因此不能把它的限量/大范围输出直接当作等价性能基准。
## 当前边界
本版交付了本地 NTFS 文件名搜索的完整常用流程,并未实现 Everything 的全部功能,也不保证所有查询都达到其性能。目前不支持无盘符卷、ReFS/FAT/exFAT/网络共享的文件夹索引、内容搜索、ETP/HTTP 服务、Everything 插件/IPC 兼容接口、高级预览及所有搜索函数;未知函数会明确报错。目录大小不递归统计,重解析点目标不会展开为额外的别名路径。仅测试 Windows x64。
第一次全盘扫描、数百万条结果的首次全量排序仍可能需要数秒;首次建索引更久。快照缓存后的启动和常用限量名称查询要快得多。索引中的文件名可被本机经过身份验证的用户查询,和文件内容读取权限是两回事;文件打开和更改仍由 Windows ACL 控制。暂时无法读取的记录会显示为统计中的 `pending` 并重试。
许可证和参考出处见 `THIRD-PARTY-NOTICES.md` 与 `licenses`。