You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测文件是否被第三方应用修改?求C#事件监听替代方案及示例

检测文件被第三方修改的更优方案(C#)

嘿,你当前用定时轮询File.GetLastWriteTime的方法确实能实现需求,但缺点也很明显:会持续占用系统资源,而且没法做到实时响应变化。其实C#里早就提供了专门的事件驱动方案——FileSystemWatcher类,它能直接监听文件系统的变化,一旦目标文件被修改(或是创建、删除、重命名),就会立刻触发对应的事件,完全不需要定时轮询。

核心优势

  • 事件驱动,实时响应文件变化,没有轮询带来的延迟
  • 资源占用极低,只在文件变化时才执行逻辑
  • 支持监听单个文件、整个目录甚至特定后缀的文件

完整代码示例

下面是一个控制台程序的示例,演示如何监听指定文件的修改事件,还加了防抖处理避免重复触发(有些编辑器保存文件时会触发多次Changed事件):

using System;
using System.IO;

class FileChangeMonitor
{
    static void Main(string[] args)
    {
        // 替换成你要监听的文件路径和文件名
        string targetDirectory = @"C:\Your\Target\Folder";
        string targetFileName = "example.txt";

        // 创建FileSystemWatcher实例,指定监听目录和目标文件
        using var fileWatcher = new FileSystemWatcher(targetDirectory, targetFileName);

        // 订阅文件修改事件
        fileWatcher.Changed += OnFileModified;
        // 可选:订阅其他事件,比如文件重命名
        fileWatcher.Renamed += OnFileRenamed;

        // 开启事件监听
        fileWatcher.EnableRaisingEvents = true;

        Console.WriteLine($"正在监听 {Path.Combine(targetDirectory, targetFileName)} 的变化...");
        Console.WriteLine("按任意键退出程序");
        Console.ReadKey();
    }

    private static void OnFileModified(object sender, FileSystemEventArgs e)
    {
        // 这里写文件被修改后的处理逻辑
        Console.WriteLine($"⚠️ 文件 {e.FullPath} 已被修改,最新写入时间:{File.GetLastWriteTime(e.FullPath)}");

        // 防抖处理:避免短时间内重复触发事件(比如编辑器保存时的多步操作)
        var watcher = (FileSystemWatcher)sender;
        watcher.EnableRaisingEvents = false;
        System.Threading.Thread.Sleep(1000); // 延迟1秒后恢复监听
        watcher.EnableRaisingEvents = true;
    }

    private static void OnFileRenamed(object sender, RenamedEventArgs e)
    {
        Console.WriteLine($"📝 文件已重命名:{e.OldFullPath} → {e.FullPath}");
    }
}

注意事项

  1. 权限问题:确保你的程序有足够的权限访问目标目录,否则无法正常监听变化
  2. 防抖处理:部分应用保存文件时会执行多步操作(比如先写临时文件再替换原文件),这会导致Changed事件多次触发,加个短延迟可以避免重复处理
  3. 监听范围:如果要监听整个目录的所有文件,把targetFileName设为*.*即可;如果要监听特定后缀,比如所有txt文件,设为*.txt

两种方案对比

方案优点缺点
定时轮询GetLastWriteTime实现简单,逻辑直观资源占用高,响应有延迟
FileSystemWatcher实时响应,资源占用极低需要处理边缘情况(重复事件、权限)

内容的提问来源于stack exchange,提问作者Tonique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:46:39