# 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 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`。