关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们查阅了 .NET FileSystemWatcher 和 WPF Dispatcher 的官方规范,并将其整理为在屏幕上显示虚拟文件夹更改事件的最小配置。
验证状态:📘 已确认 Microsoft 官方规范・Windows 实机未验证
在将 FileSystemWatcher 事件输出到 WPF 界面的尝试中,比外观更重要的是确认“事件已到达”以及“已成功传递到 UI 线程”。
本次测试中,如果在创建虚拟文件后屏幕上显示 Created 或Changed,即代表尝试成功。
冒烟测试的结构
TEMPPapanda-FileWatcher-Demo ↓ FileSystemWatcher Created / Changed / Deleted / Renamed ↓ ConcurrentQueue DispatcherTimer ↓ WPF ListBox
在 PowerShell 中,将 Watcher 的Path限定在专用的虚拟文件夹中,并设置为IncludeSubdirectories = $false。
与其直接从事件处理程序更新 WPF 控件,不如先将事件信息存入队列,并在 UI 线程侧的DispatcherTimer中将其取出,这样就可以将“接收事件的位置”与“操作界面的位置”分离开来。
观察 (Observe)
在极简版中,开始监控后会创建一个虚拟的test.txt。仅显示时间、事件名称和文件名,不读取文件内容。
可复用版中添加了“创建测试文件”按钮。由于监控对象仅限于用户的 TEMP 目录下,因此可以在不直接指定生产共享文件夹的情况下确认其行为。
尝试修改一个地方
默认的 Filter 是 *.txt 。在 Daily-Code-Samples 版本中,你可以像这样只修改一个地方。
.Show-FileEvents.ps1 -Filter '*.csv'
通过查看 TXT 和 CSV 显示对象的变化,可以确认Filter的作用。
为什么会出现多次事件
应用程序的保存处理并不一定意味着“保存一次 = 一个事件”。可能会组合创建临时文件、写入、重命名等操作。因此,在实际业务版本中,防抖(debounce)或重复抑制是必不可少的。
这一点比单纯将 FileSystemWatcher 记为“文件夹来文件时进行处理的功能”更为重要。事件只是处理开始的提示,实际文件的状态需要在处理端重新验证。
故障与边界 (Failure / Boundary)
在设计事件时,应假定可能会出现漏掉或重复的情况。不要将 Watcher 用作数据库完整审计日志的替代品。
在 Daily-Code-Samples 版本中,会在界面关闭时执行 EnableRaisingEvents = false、Dispose()、DispatcherTimer.Stop() 。这是为了确保在关闭 GUI 后不会留下残留的监控对象。
如果要在工作中实际使用
你可以将其构建为:检测到达共享文件夹的 CSV 作为“开始处理的契机”,并在实际处理端重新验证文件的存在性、大小稳定性、扩展名以及防止重复处理。
对于面向文职人员的小型内部工具,它也可以作为一种入口,例如在屏幕上显示 CSV 的到达情况,或将固定格式文件的接收状态可视化。但在进入正式的自动化处理之前,必须充分考虑重复事件和正在写入中的文件。
官方资料
Microsoft Learn: FileSystemWatcher
Microsoft Learn: Dispatcher

