.NET中提供的一个有用功能是FileSystemWatcher对象。如果您需要知道何时对目录进行更改(例如,添加,更改或删除文件),则可以使用此对象捕获一个事件,该事件描述更改后的区别。
C#监控文件更改目的
想使用C#监控服务器上哪些文件发生了更改,以及更改了哪些内容,方案有很多,其中几种是:
- 您可能想审核对目录所做的更改;
- 将文件复制到目录后,您可能希望根据该文件的属性自动处理它们(例如,用户上传的文件自动复制到另外一台FTP服务器)
我们经常会遇到这种需求,其中开发人员允许用户通过网站上传文件,并在其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事件。但是下面的图片显示了实际调用的所有事件。
让我们看看会发生什么:
- 首先创建一个文件;
- 然后它以某种方式改变了三遍。
- 然后将其重命名;
- 然后创建另一个文件并进行更改;
- 最后,原始文件被删除。
这告诉了我有关屏幕截图捕获程序如何工作的一些有趣信息-但它还告诉我期望当我拍摄单个屏幕截图时,将触发两次Created事件,因此我必须编写代码来为此做准备。
写在最后
FileSystemWatcher类是一个有用的.NET工具,用于观察目录结构的更改。因为这会监视操作系统级别的更改,所以事件可能以意外的方式被调用。因此,有必要正确理解在更改要监视的目录时调用的操作系统事件,并设计解决方案以处理实际事件(而不是逻辑上可能期望的事件)。
本文发布于网文江湖。