C#实时监测文件夹变化
在开发各种应用程序时,我们经常需要对文件系统中的文件或文件夹进行实时监测,以便在文件内容改变、文件被创建或删除时能够及时做出反应。在 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#实时监测文件夹变化的更多相关文章
- java监控指定路径下文件及文件夹变化
之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包.主要有下面几点不同:1. WatchService是采用扫描式 ...
- nodejs 监听文件夹变化的模块
使用Node.JS监听文件夹变化 fs.watch 其中Node.JS的文件系统也可侦听某个目录的改变, 如fs.watch 其中fs.watch的最大缺点就是不支持子文件夹的侦听,并且在很多情况 ...
- java 监听文件或者文件夹变化的几种方式
1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...
- 【转载】java 监听文件或者文件夹变化的几种方式
1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...
- grunt-contrib-watch 实时监测文件状态
grunt-contrib-watch:实时监测文件的增删改状态,状态改变时自动执行预定义任务使用watch时,被watch的文件可以分开写,这样可以提高watch的性能,不用每次把没修改的文件也执行 ...
- 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序
原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...
- Windows怎样实时同步文件夹?Java+Spring+Quartz+Tomcat集群实现
我有一台服务器上加了两块硬盘.其中有个目录下的数据非常重要.假设是D:\data目录.这个目录下有几十个G的文件. 我希望能把这个文件夹里的内容同步到另一块硬盘的目录下,假设是E:\data 我希望最 ...
- Java NIO.2 使用Path接口来监听文件、文件夹变化
Java7对NIO进行了大的改进,新增了许多功能: 对文件系统的访问提供了全面的支持 提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的Ja ...
- java 监听文件或文件夹变化
今天遇到一个新需求,当从服务器下载文件后用指定的本地程序打开,不知道何时文件下载完成,只能考虑监听文件夹,当有新文件创建的时候打开指定程序. 在此给出一个完整的下载和打开过程: 1.下载文件 jsp页 ...
- 使用Node.JS监听文件夹变化
使用Node.JS监听文件夹改变有许多应用场合,比如: 构建自动编绎工具 当源文件改变时,自动运行build过程,比如当你写CoffeeScript文件或SASS CSS文件时,保存之后可即时生成对应 ...
随机推荐
- Delphi2010中TResourceStream流使用
Resource可以是任意文件(图像.声音.office都可以),直接打包到编译的exe文件中,调用也非常方便 打开一个新的或已有的delphi工程 1.先在 Project->resource ...
- MySQL百万级数据大分页查询优化的实现
前言:在数据库开发过程中我们经常会使用分页,核心技术是使用用limit start, count分页语句进行数据的读取. 一.MySQL分页起点越大查询速度越慢 直接用limit start, cou ...
- Linux-RAID类型介绍、创建、彻底删除
一.RAID(磁盘阵列) 1.1.RAID概念 RAID简称为独立冗余磁盘阵列,把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术, ...
- JS leetcode 有序数组的平方 题解分析,灵活运用Math.pow与Math.abs方法
壹 ❀ 引 郁闷的周一,晚上来做一道简单的算法题提提神,题目来自leetcode977. 有序数组的平方,题目描述如下: 给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也 ...
- NC20185 [JSOI2010]缓存交换
题目链接 题目 题目描述 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache.此时,如果Cache容量已满,则必须先从中删除 ...
- sensitive-word v0.13 特性版本发布 支持英文单词全词匹配
拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署? sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word ...
- U盘安装win7提示缺少所需的CD/DVD驱动器设备驱动程序
问题: 最近使用U盘启动盘安装win7,系统弹出提示框: 解决方法: U盘别插在usb3.0的口(蓝色),换成一个usb2.0的口就可以了
- 美团面试:Kafka如何处理百万级消息队列?
美团面试:Kafka如何处理百万级消息队列? 在今天的大数据时代,处理海量数据已成为各行各业的标配.特别是在消息队列领域,Apache Kafka 作为一个分布式流处理平台,因其高吞吐量.可扩展性.容 ...
- win32-使用FillRect绘制具有渐变颜色的客户区域背景
void OnEraseBkGnd(HWND hwnd) { /* Vars */ HDC dc; /* Standard Device Context; used to do the paintin ...
- [攻防世界][Reverse]xxxorrr
将目标文件拖入IDA 反汇编main函数 __int64 __fastcall main(int a1, char **a2, char **a3) { int i; // [rsp+Ch] [rbp ...