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# Directory.CreateDirectory(string path):创建目录

    Directory.CreateDirectory(string path)方法是C#中用于创建新目录的方法,它的作用是在指定路径下创建新目录。如果指定的目录已经存在,则该方法不会对该目录进行任何操作,而是返回一个DirectoryInfo对象,该对象表示已经存在的目录。 Directory.CreateDirectory(string path)方法的使用…

    C# 2023年4月19日
    00
  • javascript数据类型中的一些小知识点(推荐)

    JavaScript数据类型中的一些小知识点 JavaScript是一种弱类型语言,其数据类型种类较多,包括基本数据类型和引用数据类型。本文将详细介绍JavaScript数据类型中的一些小知识点。 基本数据类型 字符串类型(String) 在JavaScript中,字符串类型是指包含有连续字符序列的值,其值需要使用单引号、双引号或反引号来表示。字符串类型的值…

    C# 2023年6月8日
    00
  • ADO.NET实用技巧两则

    下面是“ADO.NET实用技巧两则”的完整攻略: ADO.NET实用技巧一:使用DataReader处理大批量数据 在处理大量数据时,使用DataReader可以有效地减少内存占用。 实现方法 使用SqlCommand查询数据 “`csharp string connectionString = “YourConnectionString”; SqlCon…

    C# 2023年6月3日
    00
  • C#对多个集合和数组的操作方法(合并,去重,判断)

    C#对多个集合和数组的操作方法主要包括集合和数组的合并、去重和判断等。下面分别进行详细讲解。 集合和数组的合并 合并方法1:Concat方法 合并两个集合或数组可以使用Concat方法,该方法会返回一个新的集合或数组,包含两个集合或数组中的所有元素。具体用法如下: var list1 = new List<int> { 1, 2, 3 }; va…

    C# 2023年6月7日
    00
  • C#无损转换Image为Icon的方法

    下面我将为您详细讲解“C#无损转换Image为Icon的方法”的完整攻略。 介绍 首先,我们需要了解一下什么是ICO格式文件。ICO文件是Windows操作系统中图标的标准格式,它可以保存不同大小和颜色深度的图标。 在C#中,我们可以使用System.Drawing.Imaging命名空间中的Icon和IconInfo类来操作ICO文件。接下来,我将介绍如何…

    C# 2023年6月1日
    00
  • C#如何操作Excel数据透视表

    C#操作Excel数据透视表需要使用Microsoft.Office.Interop.Excel命名空间,以下是详细攻略: 安装Microsoft Excel:在操作Excel之前,必须安装Microsoft Excel软件。如果已经安装则可以跳过该步骤。 添加引用:右击项目,选择“添加”->“引用”,在弹出的对话框中选择“COM”标签页,找到Micr…

    C# 2023年6月6日
    00
  • .Net Core服务治理Consul自动扩展和服务调用

    在 .NET Core 中,Consul 是一种服务发现和配置工具,可以帮助我们实现服务治理。以下是 .NET Core 服务治理 Consul 自动扩展和服务调用的完整攻略: 步骤一:安装 Consul 首先,需要安装 Consul。可以从官网下载 Consul 安装包,也可以使用 Docker 安装。以下是一个使用 Docker 安装 Consul 的示…

    C# 2023年5月17日
    00
  • C# 中AutoMapper的使用方法

    下面是“C# 中AutoMapper的使用方法”的完整攻略: 1. AutoMapper 简介 AutoMapper 是一个 .NET 框架下的对象映射工具,它的主要任务是通过配置文件自动地映射实体之间的属性,省去繁琐的手工编写属性映射代码。使用 AutoMapper 可以极大地提高代码的复用性以及开发效率。 2. 安装 AutoMapper 使用 NuGe…

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