🟡 [M5] Remove 事件不经过路径过滤,可能误报 #15

Closed
opened 2026-06-03 13:53:56 +08:00 by dailz · 1 comment
Owner

文件: core/watcher/file_watcher.rs:64-73
分类: 文件监控

问题: Remove 事件在路径过滤之前就发送 FileEvent::Removed,其他事件都经过 event.paths 过滤。如果 notify 传递了非监控文件的事件,会误报文件删除。

EventKind::Remove(_) => {
    let _ = tx.send(FileEvent::Removed);  // ← 没检查路径!
    return;
}
// 路径过滤在后面
if !event.paths.iter().any(|p| p == &watch_path) { return; }

建议修复: 将路径过滤移到 match 之前,或对 Remove 事件也做路径检查。

**文件**: `core/watcher/file_watcher.rs:64-73` **分类**: 文件监控 **问题**: `Remove` 事件在路径过滤之前就发送 `FileEvent::Removed`,其他事件都经过 `event.paths` 过滤。如果 notify 传递了非监控文件的事件,会误报文件删除。 ```rust EventKind::Remove(_) => { let _ = tx.send(FileEvent::Removed); // ← 没检查路径! return; } // 路径过滤在后面 if !event.paths.iter().any(|p| p == &watch_path) { return; } ``` **建议修复**: 将路径过滤移到 match 之前,或对 Remove 事件也做路径检查。
dailz added the area/concurrencyseverity/mediumbug labels 2026-06-03 13:53:56 +08:00
Author
Owner

已修复,commit 420b853。

修复方案:将路径过滤移至 event.kind 匹配之前,所有事件类型(包括 Remove)统一经过路径检查。

变更内容

  • 提取 process_event() 函数,路径过滤在 match 之前执行
  • Remove 事件不再绕过路径过滤,非监控文件的事件会被忽略
  • WatcherError 处理保持不变(后端错误应绕过路径过滤)
  • 新增两个单元测试验证修复

测试:7 个 watcher 测试全部通过,217 个项目测试全部通过。

已修复,commit 420b853。 **修复方案**:将路径过滤移至 event.kind 匹配之前,所有事件类型(包括 Remove)统一经过路径检查。 **变更内容**: - 提取 process_event() 函数,路径过滤在 match 之前执行 - Remove 事件不再绕过路径过滤,非监控文件的事件会被忽略 - WatcherError 处理保持不变(后端错误应绕过路径过滤) - 新增两个单元测试验证修复 **测试**:7 个 watcher 测试全部通过,217 个项目测试全部通过。
dailz closed this issue 2026-06-09 13:18:55 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/logViewer#15