更新记录

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

一、FileSystemWatcher类型介绍

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

FileSystemWatcher 类型所在命名空间

  1. using System.IO;

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

二、具体实例

  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. namespace PandaTestClass
  6. {
  7. class Program
  8. {
  9. /// <summary>
  10. /// 打开文件,用于测试文件是否可用
  11. /// </summary>
  12. /// <param name="lpPathName"></param>
  13. /// <param name="iReadWrite"></param>
  14. /// <returns></returns>
  15. [DllImport("kernel32.dll")]
  16. public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
  17. /// <summary>
  18. /// 关闭句柄
  19. /// </summary>
  20. /// <param name="hObject"></param>
  21. /// <returns></returns>
  22. [DllImport("kernel32.dll")]
  23. public static extern bool CloseHandle(IntPtr hObject);
  24. /// <summary>
  25. /// 文件打开的模式,读写权限
  26. /// </summary>
  27. public const int OF_READWRITE = 2;
  28. /// <summary>
  29. /// 文件打开的模式,进程间共享读写
  30. /// </summary>
  31. public const int OF_SHARE_DENY_NONE = 0x40;
  32. /// <summary>
  33. /// 文件打开错误标志位
  34. /// </summary>
  35. public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);
  36. static void Main(string[] args)
  37. {
  38. //新建文件监听器
  39. FileSystemWatcher watcher = new FileSystemWatcher();
  40. //====配置文件监听器=====
  41. //监听的目录
  42. string monitoredPath = @"F:/";
  43. //监听的文件类型
  44. string monitoredFileType = "*.txt|*.cs";
  45. //监听的修改的具体操作类型
  46. NotifyFilters notifyFilters = NotifyFilters.FileName
  47. | NotifyFilters.Size
  48. | NotifyFilters.LastWrite;
  49. //设置参数
  50. watcher.Path = monitoredPath;
  51. monitoredFileType.Split("|")
  52. .ToList()
  53. .ForEach(elem => watcher.Filters.Add(elem));
  54. watcher.NotifyFilter = notifyFilters;
  55. //====配置文件监听器=====
  56. //====绑定事件处理函数====
  57. //(增)绑定文件创建处理函数
  58. watcher.Created += (object sender, FileSystemEventArgs args) => {
  59. Console.WriteLine("文件创建啦");
  60. Console.WriteLine($"文件名:{args.Name}");
  61. Console.WriteLine($"所在路径:{args.FullPath}");
  62. };
  63. //(删)绑定文件删除处理函数
  64. watcher.Deleted += (object sender, FileSystemEventArgs args) => {
  65. Console.WriteLine("文件删除啦");
  66. Console.WriteLine($"文件名{args.Name}");
  67. Console.WriteLine($"所在路径:{args.FullPath}");
  68. };
  69. //(改)绑定文件重命名处理函数
  70. watcher.Renamed += (object sender, RenamedEventArgs args) => {
  71. Console.WriteLine("文件重命名啦");
  72. Console.WriteLine($"旧文件名{args.OldName}");
  73. Console.WriteLine($"新文件名{args.Name}");
  74. };
  75. //(改)绑定文件修改事件处理函数
  76. watcher.Changed += (object sender, FileSystemEventArgs args) => {
  77. Console.WriteLine("文件修改啦");
  78. Console.WriteLine($"被修改的文件是{args.Name}");
  79. Console.WriteLine($"被修改的文件文件路径是{args.FullPath}");
  80. Console.WriteLine($"修改的类型{args.ChangeType.ToString()}");
  81. //====检测创建后是否可用(比如:是否复制完成)====
  82. //先检测文件是否存在
  83. FileInfo fileInfo = new(args.FullPath);
  84. if (!fileInfo.Exists)
  85. {
  86. return;
  87. }
  88. //检测文件是否复制完成
  89. IntPtr vHandle = _lopen(args.FullPath, OF_READWRITE | OF_SHARE_DENY_NONE);
  90. if (vHandle == HFILE_ERROR)
  91. {
  92. Console.WriteLine("文件还未复制完成");
  93. return;
  94. }
  95. //释放句柄
  96. CloseHandle(vHandle);
  97. //可以对文件进行操作
  98. Console.WriteLine("可以对文件进行操作了");
  99. //====检测创建后是否可用(比如:是否复制完成)====
  100. //对文件具体操作的代码
  101. };
  102. //绑定文件错误事件处理函数
  103. watcher.Error += (object sender, ErrorEventArgs args) =>{
  104. Console.WriteLine("文件出错啦");
  105. Console.WriteLine($"出错信息:{args.GetException().Message}");
  106. };
  107. //====绑定事件处理函数====
  108. //开启监听
  109. watcher.EnableRaisingEvents = true;
  110. //等待用户关闭监听
  111. while (true)
  112. {
  113. Console.WriteLine("如需关闭监听,请按Y:");
  114. if((Console.ReadKey()).Key == ConsoleKey.Y)
  115. {
  116. //释放监听器
  117. watcher.Dispose();
  118. return;
  119. }
  120. }
  121. }
  122. }
  123. }

说明:代码中基本每条语句都有注释,也没有过多的分支,一眼就可以看明白,我也就不需要过的的解释了。但需要注意的是代码中添加了处理检测文件是否可用的代码,这些代码用到了互操作代码,如果您不需要检测文件是否可用,可以将其删除。代码为了观看方法把所有代码都写在一个方法中,如果您要用在项目中,记得遵守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. Spring Boot-Profile

    文章目录 前言 一.Profile是什么? 二.使用步骤 1.多Profile文件 2.使用yml方式 3.激活方式 总结 前言 不同的环境解释:比如我们开发人员使用开发环境,项目发布时使用生产环境, ...

  2. Java中最早期的集合Vector

    1.Vector类可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作. 2 ...

  3. 如何在 Java 中实现 Dijkstra 最短路算法

    定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...

  4. springdata jpa多表查询的方式

    方式一:使用@Query注解方式查询主要有JPQL方式,也就是面向对象的方式,这种情况下查表其实查的是对象,字段是实体中的属性,该方式可以直接映射到实体,如下图. 使用jpql的方式模糊查询时候不能使 ...

  5. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

  6. 【课程汇总】OpenHarmony全场景Demo数字管家系列课(附链接)

    小孩放学了,做作业的时间到,窗帘.护眼灯自动打开,关掉电视和扫地机,给小孩一个安静舒适的学习环境:碰到学习难题,可以随时请求你的远程指导:晚上回家休息了,选择舒适的氛围灯,伴随着睡眠音乐进入梦乡:出门 ...

  7. python的字典及相关操作

    一.什么是字典 字典是Python中最强大的数据类型之一,也是Python语言中唯一的映射类型.映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希 ...

  8. JDBC中常用的类和接口

    <零基础学Java> JDBC中常用的类和接口 利用JDBC的这些类和接口可以更方便地访问并处理存储在数据库中的数据. DriverManager类 DriverManager类 是JDB ...

  9. 2021.11.10 [POI2000]病毒(AC自动机)

    2021.11.10 [POI2000]病毒(AC自动机) https://www.luogu.com.cn/problem/P2444 题意: 二进制病毒审查委员会最近发现了如下的规律:某些确定的二 ...

  10. 研讨会回放视频:如何提升Jenkins能力,使其成为真正的DevOps平台

    "如何实现集中管理.灵活高效的CI/CD"在线研讨会精彩分享 演讲嘉宾:杨海涛 在2022年3月29日举办的"如何实现集中管理.灵活高效的CI/CD"在线研讨会 ...