在开发各种应用程序时,我们经常需要对文件系统中的文件或文件夹进行实时监测,以便在文件内容改变、文件被创建或删除时能够及时做出反应。在 C# 中,System.IO.FileSystemWatcher 类为我们提供了这样一个强大的功能。

一、引入 FileSystemWatcher 类

首先,在项目中引入 System.IO 命名空间,这是使用 FileSystemWatcher 类的前提:

using System.IO;

二、创建并配置 FileSystemWatcher 实例

下面是一个简单的例子,展示了如何创建一个 FileSystemWatcher 实例并设置其监视的目录、事件类型以及事件处理函数:

public class FileFolderMonitor
{
private FileSystemWatcher _fileWatcher; public void StartMonitoring(string directoryPath)
{
// 创建 FileSystemWatcher 实例
_fileWatcher = new FileSystemWatcher(); // 设置要监视的目录路径
_fileWatcher.Path = directoryPath; // 设置要监视的更改类型(例如:修改、创建、删除)
_fileWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // 添加事件处理程序
_fileWatcher.Changed += OnChanged;
_fileWatcher.Created += OnChanged;
_fileWatcher.Deleted += OnChanged;
_fileWatcher.Renamed += OnRenamed; // 开启事件监听
_fileWatcher.EnableRaisingEvents = true; Console.WriteLine($"已开始监视文件夹: {directoryPath}");
} private void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine($"文件或文件夹发生变更: {e.FullPath},事件类型: {e.ChangeType}");
} private void OnRenamed(object source, RenamedEventArgs e)
{
Console.WriteLine($"文件或文件夹被重命名: 旧路径 {e.OldFullPath} -> 新路径 {e.FullPath}");
} public void StopMonitoring()
{
if (_fileWatcher != null)
{
// 停止引发事件
_fileWatcher.EnableRaisingEvents = false; // 清理资源
_fileWatcher.Dispose();
_fileWatcher = null; Console.WriteLine("已停止监视文件夹");
}
}
}

三、使用与注意事项

  • 在上述代码中,我们通过调用 StartMonitoring 方法启动了对指定目录的监视,并且在文件或子目录发生变化时触发相应的事件处理器。

  • NotifyFilter 属性用来定义需要监听的具体事件类型,如最后写入时间、文件名和目录名的变化等。

  • Changed、Created、Deleted 和 Renamed 四个事件分别对应于文件或文件夹的内容更改、新建、删除和重命名操作。

  • 注意事项:

  • FileSystemWatcher 类并不能保证事件的即时性或顺序性,尤其是在大量并发文件操作的情况下,可能会合并或延迟触发事件。

  • 使用 FileSystemWatcher 时应确保合理处理资源,特别是当不再需要监视时,应及时调用 Dispose 方法释放资源。

  • 总结来说,System.IO.FileSystemWatcher 是实现文件系统实时监控的强大工具,只需简单配置和事件处理,就能让我们的应用程序具备灵敏响应文件系统变化的能力。

    四、课外探索,弹出文件选择框

public static string SelectFolder(string description = "请选择一个文件夹:", Environment.SpecialFolder rootFolder = Environment.SpecialFolder.MyComputer)
{
using (FolderBrowserDialog folderDialog = new FolderBrowserDialog())
{
folderDialog.Description = description;
folderDialog.RootFolder = rootFolder; if (folderDialog.ShowDialog() == DialogResult.OK)
{
return folderDialog.SelectedPath;
}
}
return string.Empty;
}

C#实时监测文件夹变化的更多相关文章

  1. java监控指定路径下文件及文件夹变化

    之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包.主要有下面几点不同:1. WatchService是采用扫描式 ...

  2. nodejs 监听文件夹变化的模块

    使用Node.JS监听文件夹变化 fs.watch 其中Node.JS的文件系统也可侦听某个目录的改变, 如fs.watch   其中fs.watch的最大缺点就是不支持子文件夹的侦听,并且在很多情况 ...

  3. java 监听文件或者文件夹变化的几种方式

    1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...

  4. 【转载】java 监听文件或者文件夹变化的几种方式

    1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...

  5. grunt-contrib-watch 实时监测文件状态

    grunt-contrib-watch:实时监测文件的增删改状态,状态改变时自动执行预定义任务使用watch时,被watch的文件可以分开写,这样可以提高watch的性能,不用每次把没修改的文件也执行 ...

  6. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序

    原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...

  7. Windows怎样实时同步文件夹?Java+Spring+Quartz+Tomcat集群实现

    我有一台服务器上加了两块硬盘.其中有个目录下的数据非常重要.假设是D:\data目录.这个目录下有几十个G的文件. 我希望能把这个文件夹里的内容同步到另一块硬盘的目录下,假设是E:\data 我希望最 ...

  8. Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: 对文件系统的访问提供了全面的支持 提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的Ja ...

  9. java 监听文件或文件夹变化

    今天遇到一个新需求,当从服务器下载文件后用指定的本地程序打开,不知道何时文件下载完成,只能考虑监听文件夹,当有新文件创建的时候打开指定程序. 在此给出一个完整的下载和打开过程: 1.下载文件 jsp页 ...

  10. 使用Node.JS监听文件夹变化

    使用Node.JS监听文件夹改变有许多应用场合,比如: 构建自动编绎工具 当源文件改变时,自动运行build过程,比如当你写CoffeeScript文件或SASS CSS文件时,保存之后可即时生成对应 ...

随机推荐

  1. 下载、安装Git并拷贝GitHub项目到本地的流程

      本文介绍分布式开源版本控制系统Git的下载.安装,并基于Git实现克隆GitHub中项目代码的方法.   Git是一款开源软件,因此我们直接在Git的官方下载地址下载最新版本的Git即可.其中,在 ...

  2. git 拉取指定目录

    指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd ...

  3. Java 根据Map的值对 List<Map<String, Object>> 进行排序

    对 List<Map<String, Object>> 类型数据的排序 有一个Map列表, 需要对这个列表, 按Map的某几个value进行排序, 并且还要分别指定正序或者倒序 ...

  4. spring boot实现验证码登录

    内容比较简单,需要完整项目的朋友留下邮箱,给你们发. 直接看效果: 下面是实现步骤 1.验证码生成工具类(引用自网络) package com.laoxu.test.helloweb.util; im ...

  5. weblogic CVE-2024-20931分析

    weblogic 12.2.1.4.0安装 我的环境:ubuntu 22.04 + weblogic 12.2.1.4.0 + jdk8(注:weblogic不支持OpenJDK) jdk下载安装:h ...

  6. 【Android逆向】修改so文件方式修改程序行为

    1. 还是之前的那个apk 链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an 尝试使用 010Editor来修改so文件 2. 使用 ...

  7. VS Code实现SSH远程开发

    最近收获一台新台式机,但是个人主要还是使用自己的笔记本,用了几天远程控制,感觉各种不方便,最终决定配置一下VS Code实现SSH远程开发,特此记录. 首先介绍一下环境,控制端是Windows 11, ...

  8. 【进阶篇】使用 Redis 实现分布式缓存的全过程思考(一)

    目录 前言 一.关于缓存 二.基本数据结构 三.缓存注解 3.1自定义注解 3.2定义切点(拦截器) 3.3 AOP 实现 3.4使用示例 四.数据一致性 4.1缓存更新策略 4.2缓存读写过程 五. ...

  9. 1.Go 的基本数据类型

    Go 的基本数据类型

  10. JavaScript之原生ajax && jQuery之ajax

        ajax提供了异步访问服务器的方法,使页面无须刷新就可以更改页面内容,在实际情况中使用原生的情况较少但是原理需要掌握,一般都是使用jquey更轻量级的实现ajax但是原理是共同的.     原 ...