LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

C# WatchService:5个“潜伏“技巧,让文件监控稳如老狗?

freeflydom
2026年6月4日 9:26 本文热度 75

硬核拆解,从"监听混乱"到"潜伏者"自由

一、WatchService的"三宗罪":为什么开发者都在踩坑?

  1. 监听路径不规范,比我的烟灰缸还乱
    watcher.Path = @"C:\Users\";
    这路径写得比我的单身状态还随意,结果监听了不该监听的目录。

  2. 事件触发不及时,比我的单身状态还慢
    watcher.NotifyFilter = NotifyFilters.LastWrite;
    这触发条件写得比我的单身状态还盲目,结果文件修改了却没触发。

  3. 异常处理不完善,比我的单身状态还脆弱
    try { ... } catch { }
    这异常处理写得比我的单身状态还草率,结果程序直接崩溃。


二、WatchService的"黄金法则":5个潜伏技巧,让文件监听稳如老狗

✅ 技巧1:路径规范,比我的单身状态还清晰
// 以前:路径混乱,比我的单身状态还乱
var watcher = new FileSystemWatcher(@"C:\Users\");
watcher.IncludeSubdirectories = true;
// 现在:路径规范,比我的单身状态还清晰
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Documents");
var watcher = new FileSystemWatcher(path);
watcher.IncludeSubdirectories = true;

注释:

  • Path.Combine:拼接路径,比我的单身状态还安全
  • Environment.GetFolderPath:获取用户文档目录,别写死路径
  • IncludeSubdirectories:包含子目录,别漏了,否则监听不到子文件

💡 墨氏吐槽:WatchService的"路径"比我的单身状态还重要,别写死路径,否则跨平台就完蛋


✅ 技巧2:事件触发,比我的单身状态还精准
// 以前:事件触发不全,比我的单身状态还模糊
watcher.NotifyFilter = NotifyFilters.LastWrite;
// 现在:事件触发精准,比我的单身状态还清晰
watcher.NotifyFilter = NotifyFilters.LastWrite | 
                       NotifyFilters.FileName | 
                       NotifyFilters.DirectoryName;

注释:

  • NotifyFilters.LastWrite:最后写入时间,别只用这个
  • NotifyFilters.FileName:文件名,别漏了,否则文件重命名监听不到
  • NotifyFilters.DirectoryName:目录名,别漏了,否则文件夹重命名监听不到

💡 墨氏吐槽:WatchService的"事件"比我的单身状态还重要,别只监听一个事件,否则会漏掉很多变化


✅ 技巧3:异常处理,比我的单身状态还稳健
// 以前:异常处理草率,比我的单身状态还脆弱
try
{
    watcher.EnableRaisingEvents = true;
}
catch
{
    // 什么都不做
}
// 现在:异常处理完善,比我的单身状态还稳健
try
{
    watcher.EnableRaisingEvents = true;
}
catch (Exception ex)
{
    // 记录日志
    Logger.Error($"文件监听启动失败: {ex.Message}");
    // 重试
    RestartWatcher();
}

注释:

  • EnableRaisingEvents:启用事件触发,别只用try-catch,要处理异常
  • Logger.Error:记录错误日志,别只打印,要记录
  • RestartWatcher:重试机制,别直接退出,要重试

💡 墨氏吐槽:WatchService的"异常"比我的单身状态还重要,别忽略异常,否则程序直接崩溃


✅ 技巧4:事件处理,比我的单身状态还高效
// 以前:事件处理低效,比我的单身状态还慢
watcher.Changed += (sender, e) => 
{
    // 处理文件变化
    ProcessFileChange(e.FullPath);
};
// 现在:事件处理高效,比我的单身状态还快
watcher.Changed += (sender, e) => 
{
    // 避免重复触发
    if (lastChangeTime.AddSeconds(1) > DateTime.Now)
        return;
    
    // 处理文件变化
    ProcessFileChange(e.FullPath);
    
    // 更新最后变化时间
    lastChangeTime = DateTime.Now;
};

注释:

  • lastChangeTime:记录最后变化时间,别重复触发
  • AddSeconds(1):设置去抖动时间,避免频繁触发
  • ProcessFileChange:处理文件变化,别在事件处理中做耗时操作

💡 墨氏吐槽:WatchService的"事件"比我的单身状态还重要,别在事件处理中做耗时操作,否则会拖慢整个程序


✅ 技巧5:跨平台兼容,比我的单身状态还通用
// 以前:跨平台不兼容,比我的单身状态还脆弱
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
    // Windows特定代码
}
// 现在:跨平台兼容,比我的单身状态还通用
var path = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), 
    "Documents"
);
var watcher = new FileSystemWatcher(path);

注释:

  • RuntimeInformation.IsOSPlatform:检查操作系统,别用硬编码
  • Environment.SpecialFolder:获取系统特殊文件夹,别用硬编码
  • Path.Combine:拼接路径,跨平台安全

💡 墨氏吐槽:WatchService的"跨平台"比我的单身状态还重要,别用Windows特定代码,否则Linux上跑不了


三、WatchService的实战案例:从"监听盲"到"潜伏者"

案例1:实时日志监控
public class LogMonitor
{
    private FileSystemWatcher _watcher;
    private readonly string _logDirectory;
    
    public LogMonitor(string logDirectory)
    {
        _logDirectory = logDirectory;
        InitializeWatcher();
    }
    
    private void InitializeWatcher()
    {
        _watcher = new FileSystemWatcher(_logDirectory);
        _watcher.NotifyFilter = NotifyFilters.LastWrite | 
                                NotifyFilters.FileName;
        _watcher.Changed += OnFileChanged;
        _watcher.EnableRaisingEvents = true;
    }
    
    private void OnFileChanged(object sender, FileSystemEventArgs e)
    {
        // 处理日志文件变化
        ProcessLogFile(e.FullPath);
    }
    
    private void ProcessLogFile(string path)
    {
        // 读取并处理日志文件
        var content = File.ReadAllText(path);
        // ...处理日志...
    }
}

注释:

  • LogMonitor:日志监控类,比我的单身状态还专注
  • InitializeWatcher:初始化监听器,别漏了NotifyFilter
  • OnFileChanged:文件变化处理,别在事件中做耗时操作

💡 墨氏吐槽:日志监控的"实时性"比我的单身状态还重要,别在事件中做耗时操作,否则会漏掉很多日志


案例2:文件同步服务
public class FileSynchronizer
{
    private FileSystemWatcher _watcher;
    private readonly string _sourceDirectory;
    private readonly string _targetDirectory;
    
    public FileSynchronizer(string sourceDirectory, string targetDirectory)
    {
        _sourceDirectory = sourceDirectory;
        _targetDirectory = targetDirectory;
        InitializeWatcher();
    }
    
    private void InitializeWatcher()
    {
        _watcher = new FileSystemWatcher(_sourceDirectory);
        _watcher.NotifyFilter = NotifyFilters.LastWrite | 
                                NotifyFilters.FileName;
        _watcher.Changed += OnFileChanged;
        _watcher.Created += OnFileCreated;
        _watcher.Deleted += OnFileDeleted;
        _watcher.EnableRaisingEvents = true;
    }
    
    private void OnFileChanged(object sender, FileSystemEventArgs e)
    {
        SyncFile(e.FullPath);
    }
    
    private void OnFileCreated(object sender, FileSystemEventArgs e)
    {
        SyncFile(e.FullPath);
    }
    
    private void OnFileDeleted(object sender, FileSystemEventArgs e)
    {
        DeleteFile(e.FullPath);
    }
    
    private void SyncFile(string sourcePath)
    {
        var fileName = Path.GetFileName(sourcePath);
        var targetPath = Path.Combine(_targetDirectory, fileName);
        File.Copy(sourcePath, targetPath, true);
    }
    
    private void DeleteFile(string sourcePath)
    {
        var fileName = Path.GetFileName(sourcePath);
        var targetPath = Path.Combine(_targetDirectory, fileName);
        if (File.Exists(targetPath))
            File.Delete(targetPath);
    }
}

注释:

  • FileSynchronizer:文件同步服务,比我的单身状态还可靠
  • InitializeWatcher:初始化监听器,别漏了ChangedCreatedDeleted
  • SyncFile:同步文件,别在事件中做耗时操作

💡 墨氏吐槽:文件同步的"完整性"比我的单身状态还重要,别漏了CreatedDeleted事件,否则文件会丢失


尾声:从"监听混乱"到"潜伏者"自由,你只需要一个原则

“WatchService不是写出来的,是‘潜伏’出来的!”
“代码不是写出来的,是‘监控’出来的!”

  • Path.Combine:路径规范,让文件监听像快进一样简单
  • NotifyFilters:事件触发,让文件监听像呼吸一样自然
  • Exception Handling:异常处理,让文件监听稳如老狗
  • Cross-Platform:跨平台兼容,让文件监听无处不在

该文章在 2026/6/4 9:26:35 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号