0

0

C#怎么实现文件监控功能_C#如何使用FileSystemWatcher【代码】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-17 00:51:37

|

403人浏览过

|

来源于php中文网

原创

FileSystemWatcher 初始化后不触发事件,主因是路径非本地绝对路径或权限不足;文件写入未完成即触发需防抖处理;服务中易被GC回收,须强引用并校验目录存在。

FileSystemWatcher 初始化后不触发事件?检查路径和权限

最常见的现象是 filesystemwatcher 对象创建、enableraisingevents = true 也设了,但文件增删改一点反应都没有。根本原因往往不是代码逻辑错,而是路径或权限卡住了。

  • Path 必须是本地绝对路径,不能是相对路径、UNC 路径(如 \servershare)或网络映射盘符(如 Z:),否则事件完全静默
  • 监控目录需有读取+遍历权限;若监控子目录(IncludeSubdirectories = true),父目录还需有“列出文件夹内容”权限
  • 如果程序以管理员身份运行,而目标目录属普通用户(比如 C:UsersAliceDocuments),可能因 UAC 隔离导致监听失败
  • 避免监控系统敏感路径(如 C:Windows),部分 Windows 版本会直接拦截事件通知

文件写入未完成就触发 Changed?用 NotifyFilter 和延迟缓冲

当程序写入一个大文件(如日志追加、Excel 导出),Changed 事件可能在文件还没写完时就触发,导致读取到截断或损坏内容。这不是 FileSystemWatcher 的 bug,而是 Windows 文件系统通知机制的固有行为。

  • 默认 NotifyFilter 包含 LastWriteSize,小文件频繁写入会反复触发;建议缩小范围,例如只监控 FileName | DirectoryName + Attributes,再配合业务逻辑判断是否真要处理
  • ChangedCreated 事件,不要立刻打开文件——加个简单防抖:Task.Delay(100) 后检查 File.GetLastWriteTimeUtc(path) 是否稳定,或尝试 File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None) 捕获 IOException(说明还在被写入)
  • 避免在事件回调里做耗时操作(如解析 JSON、上传网络),否则会堆积事件队列,丢失后续通知

为什么 FileSystemWatcher 在服务中经常失效?生命周期和线程上下文是关键

FileSystemWatcher 放进 Windows Service 或后台线程后,事件突然停止,多数情况不是它“挂了”,而是对象被 GC 回收,或线程提前退出。

Murf AI
Murf AI

AI文本转语音生成工具

下载
  • FileSystemWatcher 实例必须被强引用住——不能定义为局部变量,也不能放在异步 lambda 里没捕获;推荐作为类字段(private readonly FileSystemWatcher _watcher)并确保所属对象长期存活
  • 事件回调(OnCreated 等)运行在线程池线程上,不是 UI 线程,也不属于服务主线程;如果回调里调用了 WinForms/WPF 控件更新,必须用 InvokeDispatcher.BeginInvoke
  • 服务启动时若目标目录不存在,FileSystemWatcher 不会报错,但也不会工作;务必在 Start 前先 Directory.Exists(path) 校验

跨平台替代方案:.NET 6+ 可用 FileSystemWatcher,但 Linux/macOS 行为差异大

.NET 5+ 确实让 FileSystemWatcher 能跑在 Linux/macOS 上,但底层依赖 inotify/kqueue,和 Windows 的 ReadDirectoryChangesW 完全不同,表现差异明显。

  • Linux 下不支持监控符号链接目标内容(只监控链接本身),且 IncludeSubdirectories = true 可能漏掉深层嵌套变动
  • macOS 对 HFS+ 卷的事件延迟更高,有时多个操作合并成单次 ChangedChangeType 可能是 Changed 而非预期的 Created
  • 如果项目明确要跨平台,别依赖 FileSystemWatcher 的精确事件顺序;更稳妥的做法是定期轮询(如 Timer + Directory.GetFiles 哈希比对),虽然低效但可控
实际用起来最麻烦的,是“写入未完成”和“服务中被回收”这两点——它们不报错,只悄悄丢事件,排查时容易绕远路。盯紧 EnableRaisingEvents 的赋值时机,以及回调里有没有没 catch 住的异常(异常会终止当前事件线程,但不影响后续)。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

458

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

83

2025.09.10

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

215

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

193

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

62

2026.01.05

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号