开局一张图,在 System.IO 下的 FileSystemWatcher 罕用于监督文件系统的变更,当文件系统中的文件或者文件夹被批改会主动触发相应的回调事件。

为了可能理解 FileSystemWatcher 是怎么运作的,你能够指定一个被监督的文件夹,当被监督的文件夹批改后,大略会触发如下的一些事件。

  • Changed: 当文件或者文件夹曾经实现批改时触发此事件
  • Created:当文件或者文件夹曾经胜利创立触发此事件
  • Deleted:当文件或者文件夹曾经胜利删除触发此事件
  • Error:当变更的过程中产生谬误触发此事件。
  • Renamed:当文件或者文件夹曾经胜利被重命名时触发此事件

创立一个简略的 file 监督

接下来咱们在 Visual Studio 中创立一个 Console 程序,用来理解如何进行文件监督,不过倡议把 Console 部署成 Windows Service,这样不便在零碎中常驻监控,一旦被监督的门路产生变更就会主动发出通知事件。

该说的都说了,接下来一起钻研代码吧。

        static void Main(string[] args)        {            string path = @"D:\IDG";            MonitorDirectory(path);            Console.ReadKey();        }

上面的代码片段展现了 MonitorDirectory 办法的外部逻辑,这个办法可用于监督指定的文件夹并且当文件夹变更时触发事件,能够看到文件夹门路是通过参数传进去的。

        private static void MonitorDirectory(string path)        {            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();            fileSystemWatcher.Path = path;            fileSystemWatcher.Created += FileSystemWatcher_Created;            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;            fileSystemWatcher.EnableRaisingEvents = true;        }

能够着重理解一下下面的 event 是如何被灌入的,而且我还写了一句 fileSystemWatcher.EnableRaisingEvents = true, 这是什么意思呢? 示意以后的门路正式开始被监控,一旦监控的门路呈现变更,FileSystemWatcher 中的指定事件将会被触发。

扫一下下面定义的各个 event 事件,别离都定义了该事件的处理函数,比如说:FileSystemWatcher_CreatedFileSystemWatcher_Renamed,FileSystemWatcher_Deleted ,不言而喻触发某一个事件就会触发它的事件处理函数,对吧,具体代码如下:

        private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)        {            Console.WriteLine("File created: {0}", e.Name);        }        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)        {            Console.WriteLine("File renamed: {0}", e.Name);        }        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)        {            Console.WriteLine("File deleted: {0}", e.Name);        }

上面是残缺的可供参考的代码清单。

using System;using System.IO;namespace IDGFileSystemWatcher{    class Program    {        static void Main(string[] args)        {            string path = @"D:\IDG";            MonitorDirectory(path);            Console.ReadKey();        }        private static void MonitorDirectory(string path)        {            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();            fileSystemWatcher.Path = path;            fileSystemWatcher.Created += FileSystemWatcher_Created;            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;            fileSystemWatcher.EnableRaisingEvents = true;        }        private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)        {            Console.WriteLine("File created: {0}", e.Name);        }        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)        {            Console.WriteLine("File renamed: {0}", e.Name);        }        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)        {            Console.WriteLine("File deleted: {0}", e.Name);        }    }}

假如 IDG 文件夹是在 E 盘内,接下来把 Console 运行起来,而后在 IDG 文件夹内创立一个新文件,不出意外的话,你会察看到这个新建的文件名将会呈现在 控制台 上,阐明 FileSystemWatcher_Created 被胜利触发,参考下图:

译文链接:https://www.infoworld.com/art...

更多高质量干货:参见我的 GitHub: csharptranslate