监视磁盘目录就用FileSystemWatcher 对象
“目录监视”这个词在我们身边并不少见,比如说FTP服务器中管理员需要对共享目录进行管理,查看用户都在做些什么操作。又如 黑客查看用户磁盘上的文件,都是属于监视。
等等(我也举步出来了,呵呵,那位大哥帮我举几个嘛!)
那么我们怎么才能去监视本地目录、网络驱动器、或者远程计算机上的目录和文件呢 ?
在.net framewrk 类库中有这样一个类FileSystemWatcher ,下面我就介绍下这个类吧!
FileSystemWatcher 类:直译过来就是"文件系统监视者".我英语烂~~不知道有没有错。
所属空间:System.IO
功能:侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件.
几个比较重要的事件:
Changed——当被监控的目录中有一个文件被修改时,就提交这个事件。值得注意的是,这个事件可能会被提交多次,即使文件的内容仅仅发生一项改变。这是由于在保存文件时,文件的其它属性也发生了改变。
Created——当被监控的目录新建一个文件时,就提交这个事件。如果你计划用这个事件移动新建的事件,你必须在事件处理器中写入一些错误处理代码,它能处理当前文件被其它进程使用的情况。之所以要这样做,是因为Created事件可能在建立文件的进程释放文件之前就被提交。如果你没有准备正确处理这种情况的代码,就可能出现异常。
Deleted——当被监控的目录中有一个文件被删除,就提交这个事件。
Renamed——当被监控的目录中有一个文件被重命名,就提交这个事件。
注:如果你没有将EnableRaisingEvents设为真,系统不会提交任何一个事件。如果有时FileSystemWatcher对象似乎无法工作,请首先检查EnableRaisingEvents,确保它被设为真。
几个比较重要的属性:
CanRaiseEvents:获得一个指示组件是否可以引发的的值.
EnableRaisingEvents :获取或设置一个值,该值指示是否启动此组件.
Filter :获取或设置筛选字符串,用于确定在目录中监视那些文件.
IncludeSubdirectories :是否监视子目录.
NotifyFilter :要监视的更改类型.
Path:要监视的目录的路径.
还有另外一个对象也不能小视:那就是FileSystemEventArgs 对象.
在我们的实际应用中可离不开它哟。
这个对象主要有这样些属性:
Name : 文件的名称或目录名称(不包括路径)
ChangeType :提交哪个类型的事件.值包括以下
Changed
Created
Deleted
Renamed
FullPath :文件名称或目录名称(全称)
备注说明:
使用FileSystemWatcher监视指定目录中的更改。可监视指定目录中的文件或自目录的更改.可以创建一个组件来监视本地计算机、网络驱动或者远程计算机上的文件。
若要监视所有文件中的更改,就将Filer属性设置为空白字符串("") 或者使用通配符("*.*").
若要监视特定的文件,就将Filer属性设置为特定的格式(请参考DOS 通配符)
可监视文件或目录的重命名、删除或创建。例如,若要监视文本文件的重命名,请将 Filter 属性设置为“*.txt”,并使用为其参数指定的 Renamed 来调用 WaitForChanged 方法。
复制和移动文件夹
操作系统和 FileSystemWatcher 对象将剪切和粘贴操作或移动操作解释为对文件夹及其内容的重命名操作。如果将包含文件的文件夹剪切并粘贴到受监视的文件夹中,则 FileSystemWatcher 对象仅将文件夹报告为新建,但不能将其内容报告为新建,因为实际上只是对它们进行了重命名。
示例
创建一个 FileSystemWatcher,以便在运行时监视指定的目录。组件设置为监视 LastWrite 和 LastAccess 时间方面的更改,以及目录及其子目录中文本文件的创建、删除或重命名。如果更改、创建或删除文件,文件路径将被输出到控制台。在文件重命名后,旧路径和新路径都输出到控制台。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Security.Policy;
namespace FileSystemWatcherTemp
{
class Program
{
static void Main(string[] args)
{
Run();
}
public static void Run()
{
String[] args = System.Environment.GetCommandLineArgs();
if (args.Length != 2)
{
Console.WriteLine("Usage:Watcher.exe (directory)");
return;
}
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.EnableRaisingEvents = true;
watcher.IncludeSubdirectories = true;
Console.WriteLine("Press/'q/' to quit the sample.");
while (Console.ReadLine().ToLower() != "quit") ;
}
private static void OnChanged(object sender, FileSystemEventArgs e)
{
Console.WriteLine("File:"+e.FullPath +" " + e.ChangeType);
}
private static void OnRenamed(object sender, RenamedEventArgs e)
{
Console.WriteLine("File:{0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}
}
测试图: