在开发各种应用程序时,我们经常需要对文件系统中的文件或文件夹进行实时监测,以便在文件内容改变、文件被创建或删除时能够及时做出反应。在 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. HttpClientTemplate JDK11以上的版本,可以用,我写的。

    package com.diandaxia.common.template; import com.fasterxml.jackson.databind.ObjectMapper; import or ...

  2. python-比较两个列表中的相同元素和不同元素

    由于两个列表(List)中可能会存在重复的元素,所以我们可以将列表转化成集合(set)进行去重,然后计算交集和差集. A = ['1','2','3'] B = ['2','4','5'] ##计算交 ...

  3. JS 可选链操作符?. 空值合并运算符?? 详解,更精简的安全取值与默认值设置小技巧

    壹 ❀ 引 说来也比较惭愧,可选链操作符?.在公司项目中使用特别频繁,而我在之前一直以为是类似奇技淫巧的写法,所以也没去查阅相关文档,直到在学习typescript时碰巧看到了可选链操作符与空值合并操 ...

  4. NC20325 [SDOI2009]HH的项链

    题目链接 题目 题目描述 HH有一串由各种漂亮的贝壳组成的项链. HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一 段贝壳,思考它们所表达的含义. HH不断地收集新的贝壳,因此他的项链 ...

  5. FireFox 报错Security Connection Failed解决方案

    1.在浏览器中输入:about:config; 2.搜索security.ssl.enable_ocsp_stapling,双击将其修改为FALSE: 3.返回重新访问之前的网站,问题解决

  6. Miniconda 安装和使用笔记

    Miniconda是Anaconda的简化版, 可以管理多个Python版本的环境. 实际使用的话, 占用的空间不会很小, 我跑一些正常的应用后, 安装目录占用空间4.3GB, 安装建议要预留10到2 ...

  7. 【Unity3D】粒子系统ParticleSystem

    1 简介 ​ 拖尾(TrailRenderer).线段渲染器(LineRenderer).粒子系统(ParticleSystem)是 Unity3D 提供的三大特效,其中粒子系统的功能最为强大,特效也 ...

  8. CSS实现渐隐渐现效果

    CSS实现渐隐渐现效果 实现渐隐渐现效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求--希望元素消失 ...

  9. 解决Burpsuite1.6中文显示乱码问题

    说明 最近公司项目被测试团队测试出有越权访问等安全问题,用的是这个Burpsuit工具,我想做软件测试的同学应该很熟悉.那么中间在模拟请求响应过程中发现返回的信息中文是乱码,搜索了一圈发现很多人提供的 ...

  10. Springboot AOP介绍及实战

    介绍 AOP是Aspect Oriented Program的首字母缩写:这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 主要用于非核心业务处理,比如权限,日志 ...