指定任意单个文件,监听文件系统变化,自动保存历史版本,全程自动。
Keen 是一款轻量级的 Windows 桌面应用(系统托盘常驻):指定单个文件(而非整个文件夹),每次保存自动留一份带时间戳的版本副本——旧版永不覆盖,任意历史可回溯与恢复。任意文件类型(代码、文档、设计稿、视频工程……),全程无需人工操作;可以理解为一个针对单个文件的本地实时“时间机器”。
它针对的是 Windows 文件监听里那些「静默出错」的边界情况(编辑器原子改名、文件锁、NTFS 文件隧道、杀软瞬时锁、睡眠/恢复……),老工具往往因此漏存、或存成保存前的旧内容。详见 工作原理。
- 拿到 Release(自包含,无需另装运行时)。
- 双击
Keen.exe—— 托盘出现「刻痕」图标。 - 双击图标 → 直接把文件拖进去,或开 Explorer 右键后添加文件(需开启相关功能)。
- 更改文件,回主窗点 历史… 看版本。
单实例:已经开着时再启动,会转发指令后静默退出,不会出现第二个窗口。
监听与存版
- 文件级监听(指定单个文件,不是文件夹)
- 任意类型;实时(保存即存,不靠定时)
- 内容有变化就存一份新版本(SHA-256 判重,原样保存不产生冗余版本),旧版永不覆盖
- 添加监控时先存一版当前状态作为基线
- 文件改名/移动(同卷)自动跟随,历史延续
历史与恢复
- 历史窗:时间 / 大小 / 较上一版增量 / 备注
- 打开此版本、打开所在文件夹、导出另存
- 恢复可逆:覆盖前自动留「恢复前快照」,可再撤回
- 对比:接 WinMerge —— 选 1 个=与上一版比,选 2 个=两方,选 3 个=三方
集成与体验
- 系统托盘常驻 + 主窗 + Explorer 右键「用 Keen 监控」
- 拖拽文件进主窗即添加;双击文件列→历史,双击路径列→打开所在文件夹
- 深浅色跟随系统;开机自启(可选);捕获失败弹通知
- 保留策略(每文件留最近 N 版 / 清超过 X 天的)
| 想做的事 | 操作 |
|---|---|
| 添加监控 | 主窗「添加文件…」/ 拖拽 / Explorer 右键「用 Keen 监控」 |
| 看某文件历史 | 主窗双击该行的文件名列,或选中后「历史…」 |
| 打开文件所在目录 | 主窗双击该行的路径列 |
| 恢复到某个旧版本 | 历史窗选中 → 「恢复…」(当前状态会先存为快照) |
| 对比两个版本 | 历史窗按 Ctrl/Shift 多选两行 → 「对比(WinMerge)」 |
| 临时停掉某个文件 | 主窗选中 → 「停止监控」(历史保留,「重新监控」和「恢复」都可用) |
| 彻底删掉某文件的历史 | 主窗选中(已停止)→ 「彻底删除」 |
| 改设置 | 托盘 → 「设置…」 |
保存 → 落库是一条五段管线:
FSW 事件
→ ① 500ms 尾沿防抖(合并连发)
→ ② 写静止 + 锁重试(20 次 / ~30s)+ FileId 校验打开
→ ③ 每文件有界队列(单消费,一个坏作业不杀消费线程)
→ ④ 流复制 + SHA-256(去重 / 基线 / 校验)
→ ⑤ WriteThrough+Flush → 原子 File.Move → 记 SQLite 索引
针对「静默出错」的关键对策:
| 风险 | 对策 |
|---|---|
| 原子改名剥离旧句柄 → 存成保存前的字节 | 复制前重开句柄并比对 FileId |
| NTFS 文件隧道让重建文件继承旧时间戳 | catch-up 基线只信 内容哈希,不信时间戳 |
| Office 等独占锁写入 | 写静止 + 锁重试 |
杀软/Defender 瞬时锁 .keenpartial → 丢版 |
失败留标记,30s 周期自动重投 |
| 覆盖原文件不原子 | 恢复前先存「恢复前快照」兜底(旧状态永远在库) |
| 崩溃留临时孤儿 | 启动清扫 .keenpartial |
| 多写者触发 SQLite WAL-reset | 单写者连接 |
托盘 → 设置…
| 项 | 默认 | 说明 |
|---|---|---|
| 保险库位置 | %LOCALAPPDATA%\Keen\vault |
重启生效,不自动迁移 |
| 每文件留最近 N 版 | 0(不限) | 保留策略 |
| 清理超过 X 天的版本 | 0(不限) | 保留策略 |
| 捕获失败时弹通知 | 开 | Windows 原生通知 |
| WinMerge 路径 | 空 | 留空则按注册表自动探测 |
| 位置 | 内容 | 怎么清 |
|---|---|---|
%LOCALAPPDATA%\Keen\config.json |
配置 | 删文件 |
%LOCALAPPDATA%\Keen\vault\ |
keen.sqlite + 各 <guid>\<YYYY-MM>\ 版本 blob |
你的历史数据,删目录即清 |
%LOCALAPPDATA%\Keen\logs\ |
按天滚动日志,留 14 天 | 自动清理 |
注册表 HKCU\…\Run\Keen |
开机自启(仅当开关开) | 托盘「开机自启」关掉即删 |
注册表 HKCU\…\*\shell\Keen.Monitor |
Explorer 右键动词(仅当开关开) | 托盘「Explorer 右键」关掉即删 |
需要 .NET 10 SDK(net10.0-windows,WinForms)。
dotnet build # → build\Debug\
dotnet publish -c Release # → build\Release\(框架依赖多文件,需目标机有 .NET 10 运行时)默认框架依赖;要出给别人用的自包含完整包(无需另装运行时):
dotnet publish -c Release --self-contained -r win-x64两种都是多文件形态(非单文件):更新时只需替换变化的文件(通常只有 Keen.dll),便于增量更新。
不做:夹级监听、网络/UNC 路径、云同步、静态加密、自带文本差异查看器(用 WinMerge 代替)、自动更新(手动替换文件即可)。
MIT