站点图标 江湖人士

C#监控文件更改情况,订阅FileSystemWatcher 4个事件满足你的要求

C#监控文件更改情况,订阅FileSystemWatcher 4个事件满足你的要求

.NET中提供的一个有用功能是FileSystemWatcher对象。如果您需要知道何时对目录进行更改(例如,添加,更改或删除文件),则可以使用此对象捕获一个事件,该事件描述更改后的区别。

C#监控文件更改目的

想使用C#监控服务器上哪些文件发生了更改,以及更改了哪些内容,方案有很多,其中几种是:

我们经常会遇到这种需求,其中开发人员允许用户通过网站上传文件,并在其Web应用程序中包含大量文件处理代码。为了使网站目录程序更加的轻量,可以将用户上传的图片与网站文件分开。

怎样使用它呢?

这个类的使用是非常简单的。我编写了一个Demo程序并将源码放在下面。

using System.IO;
using static System.Console;
using static System.ConsoleColor;
 
namespace jhrs.com
{
    class Program
    {
        static void Main(string[] args)
        {
            //实例化一个FileSystemWatcher对象
            var fileSystemWatcher = new FileSystemWatcher();
 
            //订阅事件,创建,更改,删除,重命名
            fileSystemWatcher.Created += FileSystemWatcher_Created;
            fileSystemWatcher.Changed += FileSystemWatcher_Changed;
            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;
            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
 
            //指定监控目录
            fileSystemWatcher.Path = @"C:UsersJeremyPicturesScreenshots";
 
            //启用监控.
            fileSystemWatcher.EnableRaisingEvents = true;
 
            WriteLine("Listening...");
            WriteLine("(Press any key to exit.)");
            
            ReadLine();
        }
 
        private static void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
        {
            ForegroundColor = Yellow;
            WriteLine($"A new file has been renamed from {e.OldName} to {e.Name}");
        }
 
        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)
        {
            ForegroundColor = Red;
            WriteLine($"A new file has been deleted - {e.Name}");
        }
 
        private static void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            ForegroundColor = Green;
            WriteLine($"A new file has been changed - {e.Name}");
        }
 
        private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {
            ForegroundColor = Blue;
            WriteLine($"A new file has been created - {e.Name}");
        }
    }
}

有什么问题吗?

好吧,也许我不会称它们为问题,但是当我使用此实用程序时,肯定有一些事情令我感到惊讶。

例如,当我拍摄一个屏幕截图并保存到我的Screenshots文件夹时,我只希望调用一个事件– Created事件。但是下面的图片显示了实际调用的所有事件。

C#监控文件更改

让我们看看会发生什么:

这告诉了我有关屏幕截图捕获程序如何工作的一些有趣信息-但它还告诉我期望当我拍摄单个屏幕截图时,将触发两次Created事件,因此我必须编写代码来为此做准备。

写在最后

FileSystemWatcher类是一个有用的.NET工具,用于观察目录结构的更改。因为这会监视操作系统级别的更改,所以事件可能以意外的方式被调用。因此,有必要正确理解在更改要监视的目录时调用的操作系统事件,并设计解决方案以处理实际事件(而不是逻辑上可能期望的事件)。

本文发布于网文江湖

退出移动版