C#的FileSystemWatcher用法实例详解

C# 的 FileSystemWatcher 类是一种监控文件变化的工具,允许我们监控一个特定的文件或者目录中的任一更改,比如内容修改、新增、删除等行为。下面,我将详细讲解 FileSystemWatcher 的使用方法,并附带两个示例说明。

前置条件

在使用 FileSystemWatcher 类之前,需要先引入 System.IO 命名空间,以便于访问所需的类和方法。

using System.IO;

监控目录的变化

在应用程序中,可以使用下面的代码来监控目录的变化,包括文件的创建、修改和删除等操作:

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\\test";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.EnableRaisingEvents = true;

上述代码创建了一个 FileSystemWatcher 的实例对象,并将监控的目录设置为 "C:\test"。使用 NotifyFilter 属性指定要监控的事件类型,这里包括文件的最后访问时间、最后修改时间、文件名以及目录名。Filter 属性用于指定要监视的文件类型,例如 "*.txt" 表示监控所有的文本文件类型。

另外,使用上述代码还定义了四个事件处理程序,分别对应于文件变化、创建、删除和重命名。例如,OnChanged 方法用于处理文件被修改的事件:

private static void OnChanged(object source, FileSystemEventArgs e)
{
    Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}

在事件处理程序中,可以对文件的变化做出相应的处理操作。最后,将 EnableRaisingEvents 属性设置为 true,以启动 FileSystemWatcher 监控。

监控文件的变化

除了监控整个目录以外,还可以仅仅监控单个文件的变化,操作方法如下:

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\\test\\test.txt";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "test.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;

上述代码中,创建了一个 FileSystemWatcher 的实例对象,并用 Path 属性指定要监控的文件路径。其余属性配置与之前的示例类似。需要注意,这种监控方式只能监控单个文件,不能监控整个目录内的文件变化。

示例说明

下面,我们将使用两个示例来进一步说明 FileSystemWatcher 的用法。

示例一:监控文件内容的变化

假设我们要监控一个文本文件,当其中的内容有变化时,将修改后的内容输出到命令行中。可以使用下面的代码实现:

static void Main(string[] args)
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = ".";
    watcher.Filter = "test.txt";
    watcher.NotifyFilter = NotifyFilters.LastWrite;
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    Console.WriteLine("Starting to monitor changes...");
    watcher.EnableRaisingEvents = true;
    Console.ReadKey();
}

private static void OnChanged(object sender, FileSystemEventArgs e)
{
    // wait for the file to be released
    while (IsFileLocked(e.FullPath))
    {
        Thread.Sleep(500);
    }

    // read the file content
    string content = string.Empty;
    try
    {
        content = File.ReadAllText(e.FullPath);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

    Console.WriteLine(content);
}

// check if the file is locked or not
public static bool IsFileLocked(string filePath)
{
    FileStream stream = null;
    try
    {
        stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        return true;
    }
    finally
    {
        if (stream != null)
        {
            stream.Close();
        }
    }
    return false;
}

上述代码监视了当前目录下的 test.txt 文件,当其内容被修改时,将修改后的内容输出到命令行。在 OnChanged 方法中,使用 File.ReadAllText 方法读取文件内容,需要注意的是,在文件被编辑的过程中,该文件可能会被锁定,导致读取失败,因此可以使用一个 IsFileLocked 方法来检查文件是否被锁定,并在文件被释放之后再读取。

示例二:监控多个文件夹和文件

假设我们要监控多个文件夹和文件的变化,当其中任意一个文件或文件夹内的内容发生变化时,都可以及时地收到通知。可以使用如下代码实现:

static void Main(string[] args)
{
    FileSystemWatcher dirWatcher = new FileSystemWatcher();
    dirWatcher.Path = @"C:\test";
    dirWatcher.IncludeSubdirectories = true;
    dirWatcher.NotifyFilter = NotifyFilters.LastWrite;
    dirWatcher.Changed += new FileSystemEventHandler(OnDirChanged);
    dirWatcher.Created += new FileSystemEventHandler(OnDirChanged);
    dirWatcher.EnableRaisingEvents = true;

    FileSystemWatcher fileWatcher = new FileSystemWatcher();
    fileWatcher.Path = @"C:\test\test.txt";
    fileWatcher.NotifyFilter = NotifyFilters.LastWrite;
    fileWatcher.Changed += new FileSystemEventHandler(OnFileChanged);
    fileWatcher.EnableRaisingEvents = true;

    Console.WriteLine("Starting to monitor changes...");
    Console.ReadKey();
}

private static void OnDirChanged(object sender, FileSystemEventArgs e)
{
    Console.WriteLine($"Directory: {e.FullPath} {e.ChangeType}");
}

private static void OnFileChanged(object sender, FileSystemEventArgs e)
{
    Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}

上述代码监视了 C:\test 目录及其子目录下的所有文件和文件夹,以及 C:\test\test.txt 文件。当这些文件或文件夹的内容发生变化时,都将触发相应的事件处理程序,并输出对应的变化信息。

注:以上示例中的代码只是对 FileSystemWatcher 类的部分用法的说明,实际应用和使用场景会更为复杂,需要根据具体需求进行调整和完善。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#的FileSystemWatcher用法实例详解 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • 使用 C# 下载文件的多种方法小结

    下面是使用C#下载文件的多种方法小结的完整攻略,包含两条示例。 1. WebClient下载文件 使用WebClient下载文件是C#中最简单的方法之一。WebClient是System.Net中一个提供Web请求功能的类,可用来下载文件。 示例代码: using System.Net; string url = "http://example.c…

    C# 2023年5月15日
    00
  • Windows Server2012 安装配置DNS服务器方法详解

    下面是关于“Windows Server 2012安装配置DNS服务器方法详解”的完整攻略,包含两个示例。 1. DNS服务器简介 DNS(Domain Name System)是互联网上的一种命名系统,用于将域名转换为IP地址。DNS服务器是运行DNS服务的计算机,它负责将域名解析为IP地址。在Windows Server 2012中,可以使用DNS服务器…

    C# 2023年5月15日
    00
  • CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南(1)

      本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html     0.说明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的 MVVM 库。它支持:.NET Standard 2.0、 .…

    C# 2023年4月18日
    00
  • 在.NET程序崩溃时自动创建Dump的思路详解

    以下是关于在.NET程序崩溃时自动创建Dump的思路详解: 1. 问题描述 在.NET程序运行过程中,可能会遇到各问题,例如崩溃、死锁、内存泄漏等。为了更好地诊断和解决这些问题我们需要在程序崩溃时自创建Dump文件。本攻略将介绍如何实现在.NET程序崩溃时自动创建Dump文件。 2. 解决方案 在.NET程序中,我们使用Microsoft.Diagnosti…

    C# 2023年5月12日
    00
  • Unity实现桌面反弹的示例代码

    下面是Unity实现桌面反弹的完整攻略及示例代码。 桌面反弹的实现过程 首先,我们需要创建一个3D球体作为桌球,并且给它添加物理组件,如刚体和碰撞体,以便后面更好地实现球的反弹。 接着,我们需要创建多个3D立方体作为障碍物,并给它们添加物理组件,如刚体和碰撞体。这种障碍物的数量和形状将会对球的运动轨迹产生影响。 在程序中,我们需要创建OnCollisionE…

    C# 2023年5月15日
    00
  • 详解ASP.NET中Session的用法

    下面是详解ASP.NET中Session的用法的完整攻略: 什么是Session Session是ASP.NET中一个重要的状态管理机制,用于在Web应用程序中存储和使用用户特定的数据。Session数据存储在服务器上,以确保对敏感信息的控制和安全性。Session生命周期从用户第一次访问Web站点开始,直到用户关闭浏览器或Session超时为止。Sessi…

    C# 2023年5月31日
    00
  • C#中backgroundWorker类的用法详解

    C#中BackgroundWorker类的用法详解 1.背景介绍 BackgroundWorker是一个简化多线程编程的组件,一般用来实现后台操作。相比于Thread类,BackgroundWorker更加易于使用,而且可以避免许多线程相关的问题。在BackgroundWorker中,通过DoWork事件处理程序处理计算任务,并把计算结果通过RunWorke…

    C# 2023年5月15日
    00
  • 理解ASP.NET Core 配置系统

    理解ASP.NET Core 配置系统 在ASP.NET Core应用程序中,配置系统是一项非常重要的任务。配置系统可以帮助我们管理应用程序的配置信息,提高应用程序的可维护性和可扩展性。在本攻略中,我们将介绍ASP.NET Core配置系统的基本概念和使用方法,并提供两个示例说明。 1. 配置系统的基本概念 在ASP.NET Core应用程序中,配置系统是由…

    C# 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部