C#监控文件更改是很容易实现的,.NET中提供的一个有用功能是FileSystemWatcher对象。如果您需要知道何时对目录进行更改(例如,添加,更改或删除文件),则可以使用此对象捕获一个事件,该事件描述更改后的区别。
.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工具,用于观察目录结构的更改。因为这会监视操作系统级别的更改,所以事件可能以意外的方式被调用。因此,有必要正确理解在更改要监视的目录时调用的操作系统事件,并设计解决方案以处理实际事件(而不是逻辑上可能期望的事件)。
本文发布于网文江湖。
User Review
( votes)本文转载自国外博客,原文链接:https://jeremylindsayni.wordpress.com/2016/04/10/how-to-use-the-filesystemwatcher-in-c-to-report-file-changes-on-disk/,经授权后发布,本文观点不代表江湖人士立场,转载请联系原作者。