当前位置: 首页 > news >正文

C#VB.NET中实现可靠的文件监控(新建、删除、改名、内容修改等事件的准确捕获)​

在VB.NET中实现可靠的文件监控(包括新建、删除、改名、内容修改等事件的准确捕获),直接使用ReadDirectoryChangesW API 容易出现事件错乱(尤其是重命名和移动场景),因为该 API 本身对复杂操作的事件通知不够直观。

推荐以下几种成熟的 NuGet 包或组件,它们封装了底层逻辑,能更准确地处理文件系统事件:

1. FileSystemWatcher(.NET 内置类,无需额外安装)

.NET Framework/.NET Core 自带的System.IO.FileSystemWatcher类,本质上封装了ReadDirectoryChangesW,但做了一定的事件处理优化。虽然在极端场景(如高频操作)下仍可能有事件重复或顺序问题,但对于大多数常规场景足够可靠。

优势:无需额外依赖,原生支持。不足:重命名操作会拆分为 “删除旧文件 + 创建新文件” 两个事件,需手动关联(可通过临时缓存文件名和时间戳判断)。

基本用法

Imports System.IOPublic Class FileMonitorPrivate WithEvents watcher As New FileSystemWatcher()Public Sub StartMonitoring(path As String)watcher.Path = pathwatcher.IncludeSubdirectories = True ' 监控子目录' 监控的事件类型watcher.NotifyFilter = NotifyFilters.FileName Or NotifyFilters.DirectoryName Or NotifyFilters.LastWritewatcher.EnableRaisingEvents = TrueEnd Sub' 文件/目录创建Private Sub watcher_Created(sender As Object, e As FileSystemEventArgs) Handles watcher.CreatedConsole.WriteLine($"创建: {e.FullPath}")End Sub' 文件/目录删除Private Sub watcher_Deleted(sender As Object, e As FileSystemEventArgs) Handles watcher.DeletedConsole.WriteLine($"删除: {e.FullPath}")End Sub' 文件/目录重命名(需处理OldFullPath和FullPath)Private Sub watcher_Renamed(sender As Object, e As RenamedEventArgs) Handles watcher.RenamedConsole.WriteLine($"重命名: {e.OldFullPath} -> {e.FullPath}")End Sub' 文件内容修改(基于LastWrite时间)Private Sub watcher_Changed(sender As Object, e As FileSystemEventArgs) Handles watcher.ChangedConsole.WriteLine($"修改: {e.FullPath}")End Sub
End Class

2. AlphaFS(推荐用于复杂场景)

NuGet 包AlphaFS(搜索安装)一个增强型文件系统操作库,封装了底层 API 并解决了FileSystemWatcher的诸多缺陷,尤其对重命名、移动、网络路径(UNC)等场景支持更可靠。

优势

  • 重命名事件准确捕获(不会拆分为删除 + 创建)。
  • 支持更多事件细节(如文件大小变化、属性变化)。
  • 处理网络路径和长路径(超过 260 字符)更稳定。

基本用法

vb

Imports Alphaleonis.Win32.Filesystem
Imports Alphaleonis.Win32.Filesystem.WatcherPublic Class AlphaFSMonitorPrivate WithEvents watcher As New FileSystemWatcher()Public Sub StartMonitoring(path As String)watcher.Path = pathwatcher.IncludeSubdirectories = Truewatcher.NotifyFilter = NotifyFilters.FileName Or NotifyFilters.DirectoryName Or NotifyFilters.LastWritewatcher.EnableRaisingEvents = TrueEnd Sub' 重命名事件(准确捕获)Private Sub watcher_Renamed(sender As Object, e As RenamedEventArgs) Handles watcher.RenamedConsole.WriteLine($"重命名: {e.OldFullPath} -> {e.FullPath}")End Sub' 其他事件(创建、删除、修改)与FileSystemWatcher类似
End Class

3. DirectoryMonitor(轻量级监控库)

NuGet 包DirectoryMonitor一个轻量级库,专注于文件系统监控,通过对比快照和事件结合的方式减少误报,适合对事件准确性要求高的场景。

优势

  • 内置事件去重和关联逻辑(如自动识别重命名而非删除 + 创建)。
  • 支持批量操作处理,减少高频事件的干扰。

基本用法

vb

Imports DirectoryMonitorPublic Class DirMonitorExamplePrivate monitor As New DirectoryMonitor()Public Sub Start(path As String)monitor.AddDirectory(path, recursive:=True)AddHandler monitor.FileCreated, AddressOf OnFileCreatedAddHandler monitor.FileDeleted, AddressOf OnFileDeletedAddHandler monitor.FileRenamed, AddressOf OnFileRenamedAddHandler monitor.FileChanged, AddressOf OnFileChangedmonitor.Start()End SubPrivate Sub OnFileRenamed(sender As Object, e As FileRenamedEventArgs)Console.WriteLine($"重命名: {e.OldPath} -> {e.NewPath}")End Sub' 其他事件处理方法...
End Class

4. FileSystemWatcherEx(扩展版)

NuGet 包FileSystemWatcherExFileSystemWatcher的扩展,增加了事件合并、重命名识别、错误重试等功能,适合需要兼容旧系统但又要提升可靠性的场景。

总结推荐:

  • 简单场景:直接使用.NET 内置的FileSystemWatcher,通过手动逻辑(如缓存)处理重命名关联。
  • 复杂场景(重命名 / 移动关键):优先选择AlphaFS,成熟稳定,对边缘情况处理更好。
  • 轻量需求DirectoryMonitor,配置简单,事件准确性高。

这些库均通过封装和优化底层 API,解决了ReadDirectoryChangesW直接使用时的事件错乱问题,可根据项目复杂度选择。

编辑分享

目录

1. FileSystemWatcher(.NET 内置类,无需额外安装)

2. AlphaFS(推荐用于复杂场景)

3. DirectoryMonitor(轻量级监控库)

4. FileSystemWatcherEx(扩展版)

总结推荐:


如何使用FileSystemWatcher类实现文件监控?

除了FileSystemWatcher类,还有哪些方法可以实现文件监控?

FileSystemWatcher类在监控文件时如何避免事件重复?

http://www.dtcms.com/a/610307.html

相关文章:

  • Python数据科学与图像处理利器组合:Prophet、Arch、Scikit-image、Pillow-heif用法全解析
  • wordpress 4.6.1海外广告优化师
  • 【运维】GNU/Linux 入门笔记
  • 长沙鞋网站建设煤矿建设工程质量监督总站网站
  • 学做川菜下什么网站爱网站黄
  • 前端自定义右键菜单与图片复制(兼容H5)
  • [Switch大气层]纯净版+特斯拉版 20.5.0大气层1.9.5心悦整合包 固件 工具 插件 前端等switch游戏资源下载合集
  • 同样算法的DFS求解数独C和Python程序用时比较
  • vue3+element-china-area-data 实现省市区三级联动
  • Next.js 项目常见报错排查与解决
  • Vue 校验输入时间与当前时间差大于等于3小时
  • html中网站最下面怎么做设计主题网站
  • 起重机智能选型:从血泪教训到科技护航的革新之路
  • java+maven配置yguard的一次实验
  • 汝南县网站建设Wordpress实现中英文
  • ASC学习笔记0006:游戏效果将如何复制到客户端
  • 延安市住建建设网站无锡网站营销推广
  • 我想做网站服务器选用什么电子商务网站建设总结与体会
  • Oracle分页sql
  • Airsim仿真、无人机、无人车、Lidar、深度强化学习
  • Airsim仿真、无人机、Lidar深度相机、DDPG深度强化学习
  • 做做网站下载2023常熟网站网站建设
  • app推广策略WordPress优化百度广告
  • pinctrl子系统介绍
  • python-MCPServer拉取和使用部署
  • 17.TCP编程(二)和序列化
  • x^3 - 3x + 1 = 0
  • Nacos 9848启动端口占用 Failed to bind to address 0.0.0.0/0.0.0.0:9848
  • 前端react 开发 图书列表分页
  • 做vip视频网站赚钱吗最近一周新闻大事件