更新记录

本文迁移自Panda666原博客,原发布时间:2021年7月2日。

一、FileSystemWatcher类型介绍

在.NET中使用 FileSystemWatcher 类型可以进行监视指定目录的更改。通过自定义的监听设置,可监视指定目录中的文件或子目录的更改。通过该类可以不只是监视本地计算机的文件,还可以监听网络驱动器或远程计算机的文件。

FileSystemWatcher 类型所在命名空间

using System.IO;

注意:一定要确保新建/修改等完成后再进行对文件的操作,可以检测文件是否可用,再进行操作。

二、具体实例

using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices; namespace PandaTestClass
{
class Program
{
/// <summary>
/// 打开文件,用于测试文件是否可用
/// </summary>
/// <param name="lpPathName"></param>
/// <param name="iReadWrite"></param>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern IntPtr _lopen(string lpPathName, int iReadWrite); /// <summary>
/// 关闭句柄
/// </summary>
/// <param name="hObject"></param>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject); /// <summary>
/// 文件打开的模式,读写权限
/// </summary>
public const int OF_READWRITE = 2; /// <summary>
/// 文件打开的模式,进程间共享读写
/// </summary>
public const int OF_SHARE_DENY_NONE = 0x40; /// <summary>
/// 文件打开错误标志位
/// </summary>
public static readonly IntPtr HFILE_ERROR = new IntPtr(-1); static void Main(string[] args)
{
//新建文件监听器
FileSystemWatcher watcher = new FileSystemWatcher(); //====配置文件监听器=====
//监听的目录
string monitoredPath = @"F:/";
//监听的文件类型
string monitoredFileType = "*.txt|*.cs";
//监听的修改的具体操作类型
NotifyFilters notifyFilters = NotifyFilters.FileName
| NotifyFilters.Size
| NotifyFilters.LastWrite; //设置参数
watcher.Path = monitoredPath;
monitoredFileType.Split("|")
.ToList()
.ForEach(elem => watcher.Filters.Add(elem));
watcher.NotifyFilter = notifyFilters;
//====配置文件监听器===== //====绑定事件处理函数====
//(增)绑定文件创建处理函数
watcher.Created += (object sender, FileSystemEventArgs args) => {
Console.WriteLine("文件创建啦");
Console.WriteLine($"文件名:{args.Name}");
Console.WriteLine($"所在路径:{args.FullPath}");
}; //(删)绑定文件删除处理函数
watcher.Deleted += (object sender, FileSystemEventArgs args) => {
Console.WriteLine("文件删除啦");
Console.WriteLine($"文件名{args.Name}");
Console.WriteLine($"所在路径:{args.FullPath}");
}; //(改)绑定文件重命名处理函数
watcher.Renamed += (object sender, RenamedEventArgs args) => {
Console.WriteLine("文件重命名啦");
Console.WriteLine($"旧文件名{args.OldName}");
Console.WriteLine($"新文件名{args.Name}");
}; //(改)绑定文件修改事件处理函数
watcher.Changed += (object sender, FileSystemEventArgs args) => {
Console.WriteLine("文件修改啦");
Console.WriteLine($"被修改的文件是{args.Name}");
Console.WriteLine($"被修改的文件文件路径是{args.FullPath}");
Console.WriteLine($"修改的类型{args.ChangeType.ToString()}"); //====检测创建后是否可用(比如:是否复制完成)====
//先检测文件是否存在
FileInfo fileInfo = new(args.FullPath);
if (!fileInfo.Exists)
{
return;
} //检测文件是否复制完成
IntPtr vHandle = _lopen(args.FullPath, OF_READWRITE | OF_SHARE_DENY_NONE);
if (vHandle == HFILE_ERROR)
{
Console.WriteLine("文件还未复制完成");
return;
} //释放句柄
CloseHandle(vHandle);
//可以对文件进行操作
Console.WriteLine("可以对文件进行操作了");
//====检测创建后是否可用(比如:是否复制完成)==== //对文件具体操作的代码
}; //绑定文件错误事件处理函数
watcher.Error += (object sender, ErrorEventArgs args) =>{
Console.WriteLine("文件出错啦");
Console.WriteLine($"出错信息:{args.GetException().Message}");
};
//====绑定事件处理函数==== //开启监听
watcher.EnableRaisingEvents = true; //等待用户关闭监听
while (true)
{
Console.WriteLine("如需关闭监听,请按Y:");
if((Console.ReadKey()).Key == ConsoleKey.Y)
{
//释放监听器
watcher.Dispose();
return;
}
}
}
}
}

说明:代码中基本每条语句都有注释,也没有过多的分支,一眼就可以看明白,我也就不需要过的的解释了。但需要注意的是代码中添加了处理检测文件是否可用的代码,这些代码用到了互操作代码,如果您不需要检测文件是否可用,可以将其删除。代码为了观看方法把所有代码都写在一个方法中,如果您要用在项目中,记得遵守SOLID,将代码进行拆分成多个单独的部分。

使用FileSystemWatcher监听文件状态的更多相关文章

  1. FileSystemWatcher监听文件是否有被修改

    作用:监听文件系统更改通知,并在目录或目录中的文件更改时引发事件. 需求:监听特定文件是否修改,然后做出相应的操作. 方法: ①利用一个线程,一直去查找该指定的文件是否有被修改,如果修改则操作特定步骤 ...

  2. C# FileSystemWatcher监听文件事件

    现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...

  3. c# 监听文件夹动作

    static FileSystemWatcher watcher = new FileSystemWatcher(); /// <summary>        /// 初始化监听     ...

  4. Android实时监听网络状态

    Android实时监听网络状态(1)   其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...

  5. node.js监听文件变化

    前言 随着前端技术的飞速发展,前端开发也从原始的刀耕火种,向着工程化效率化的方向发展.在各种开发框架之外,打包编译等技术也是层出不穷,开发体验也是越来越好.例如HMR,让我们的更新可以即时可见,告别了 ...

  6. oracle 监听文件 说明

    MAR:电脑笔记 不做整理 .. ORACLE_SID=orcl2 instance_name=sicca 静态注册文件中SID_NAME=ORACLE_SID 动态注册的时候是用的instance_ ...

  7. IOS-网络(监听网络状态)

    // // BWNetWorkTool.h // IOS_0131_检测网络状态 // // Created by ma c on 16/1/31. // Copyright © 2016年 博文科技 ...

  8. Linux 文件锁flock 实现两个进程相互监听存活状态

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依参数operation所指 ...

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

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

随机推荐

  1. eclipse 下 SpringBoot 工程使用Maven打包

    eclipse 下 SpringBoot 工程使用Maven打包 1. pom.xml 添加打包配置 点击查看代码 <!-- 打包使用 --> <build> <plug ...

  2. Python Requests 速通爆肝、这么牛逼的库你还不会用吗?

    上网原理 爬虫原理 Get.Post Requests 介绍 安装 常用方法 Http协议 开发者工具网络界面 Response对象 下载保存一张图片.一首音乐 添加Headers发送请求 判断HTT ...

  3. 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)

    2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...

  4. HTTP:聊一聊HTTPS

    一.什么是https https是http的升级,因为http是明文传输的,所以非常不安全,https在http的基础上进行了数据加密. 二.https的加密方式 1.对称加密 服务端会给客户端发送一 ...

  5. Failed to load resource: the server responded with a status of 404 ()

    今天遇到了一个一开始感觉很莫名其妙的报错 在编写页面的时候把原先写在html页面里的js代码单独拿出来做成一个JavaScriptUtil文件,放在了和html页面同一个目录下.运行之后在对应的页面c ...

  6. 9.1 Linux存储结构和文件系统

    1. 存储结构 Linux系统中的一切文件都是从"根"目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途. 目录名称 应放置文件的 ...

  7. 项目开发字符串模型strstr_while

    #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <std ...

  8. Vue 学习之路(一)- 创建脚手架并创建项目

    安装脚手架 命令 npm install -g @vue/cli 打开 cmd 窗口输入以上命令.当出现以下界面即表示安装完成. 查看已安装脚手架版本 命令 vue -V 在 cmd 窗口输入以上命令 ...

  9. 《Streaming Systems》第二章: 数据处理中的 What, Where, When, How

    本章中,我们将通过对 What,Where,When,How 这 4 个问题的回答,逐步揭开流处理过程的全貌. What:计算什么结果? 也就是我们进行数据处理的目的,答案是转换(transforma ...

  10. 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...