您的位置:首页 > 运维架构

.NET拾忆:FileSystemWatcher 文件监控

2017-05-16 14:42 246 查看
资源:

https://msdn.microsoft.com/zh-cn/library/system.io.filesystemwatcher_properties(v=vs.110).aspx

FileSystemWatcher类

监控指定文件或目录的文件变化并触发相应事件。例如增删改、重命名、大小变化;可以按需要自定义需要监控的文件类型及文件属性改动的类型。

1.属性:

Path :设置要监视的目录的路径。

IncludeSubdirectories :设置是否级联监视指定路径中的子目录。true/false

Filter :设置筛选字符串,用于确定在目录中监视哪些类型的文件。如:"*.txt|*.doc|*.jpg"

NotifyFilter :设置文件的哪些属性的变动会触发Changed事件。(默认值为 NotifyFilter.LastWrite | NotifyFilter.FileName | NotifyFilter.DirectoryName)

Attributes -- 文件或文件夹的属性。
CreationTime -- 文件或文件夹的创建时间。
DirectoryName -- 目录名
FileName -- 文件名
LastAccess -- 文件或文件夹上一次打开的日期。
LastWrite -- 上一次向文件或文件夹写入内容的日期。
Security -- 文件或文件夹的安全设置。
Size -- 文件或文件夹的大小。

EnableRaisingEvents :设置是否开始监控。(默认为false)

2.常用事件:
Changed :当更改文件和目录时发生,可以通过NotifyFilter属性设置触发该事件的需要文件更改的属性。

Created : 当创建文件和目录时发生。

Deleted : 删除文件或目录时发生。

Renamed :重命名文件或目录时发生。

3、事件类型:

1)FileSystemEventArgs 对象:

成员:Name: 获取受影响的文件或目录的名称。 注意:如果是级联监控子目录的话,该值为从监控目录的下个目录到受影响的文件的路径,而不只是受影响的文件名。

FullPath : 获取受影响的文件或目录的完全限定的路径。

ChangeType :获取受影响的文件或目录的发生的事件类型。

All -- 文件或文件夹的创建、删除、更改或重命名。
Changed -- 文件或文件夹的更改。更改的类型包括大小、属性、安全设置、最近写入时间和最近访问时间方面的更改。
Created -- 文件或文件夹的创建。
Deleted -- 文件或文件夹的删除。
Renamed -- 文件或文件夹的重命名。

2)RenamedEventArgs 对象:

成员:

Name: 获取受影响的文件或目录的新名称。

OldName : 获取受影响的文件或目录的旧名称。

FullPath : 获取受影响的文件或目录的完全限定的路径。

OldFullPath : 获取受影响的文件或目录的前一个完全限定的路径。

ChangeType :获取受影响的文件或目录的发生的事件类型。

All -- 文件或文件夹的创建、删除、更改或重命名。
Changed -- 文件或文件夹的更改。更改的类型包括大小、属性、安全设置、最近写入时间和最近访问时间方面的更改。
Created -- 文件或文件夹的创建。
Deleted -- 文件或文件夹的删除。
Renamed -- 文件或文件夹的重命名。

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace WindowsConsoleApp
{
public class FileWatchTest
{

#region 32位程序访问64位系统文件
// 关闭64位(文件系统)的操作转向
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
// 开启64位(文件系统)的操作转向
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);

// IntPtr oldWOW64State = new IntPtr();
// Wow64DisableWow64FsRedirection(ref oldWOW64State);

private bool disabled = false;
private IntPtr oldWOW64State = new IntPtr();

/// <summary>
/// 禁止64位系统转向(true关闭转向,false开启)
/// </summary>
public bool DisableWow64
{
get
{
return disabled;
}
set
{
if (disabled == value)
{
return;
}

disabled = value;

if (disabled)
{
Wow64RevertWow64FsRedirection(oldWOW64State);
}
else
{
Wow64RevertWow64FsRedirection(oldWOW64State);
}

}
}
#endregion

public void StartWatch(string path, string filter)
{
FileSystemWatcher watcher = new FileSystemWatcher();

watcher.Path = path;
watcher.IncludeSubdirectories = false;   //设置是否监控目录下的所有子目录
//watcher.Filter = "*.txt|*.doc|*.jpg";   //设置监控文件的类型
watcher.Filter = filter;
watcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite | NotifyFilters.FileName;   //设置文件的文件名、目录名及文件的大小改动会触发Changed事件

watcher.Changed += new FileSystemEventHandler(OnProcess);
watcher.Created += new FileSystemEventHandler(OnProcess);
watcher.Deleted += new FileSystemEventHandler(OnProcess);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.Error += new ErrorEventHandler(OnError);
watcher.EnableRaisingEvents = true;
}

#region 监控事件

private static void OnProcess(object source, FileSystemEventArgs e)
{
if (e.ChangeType == WatcherChangeTypes.Created)
{
OnCreated(source, e);

}
else if (e.ChangeType == WatcherChangeTypes.Changed)
{
OnChanged(source, e);

}
else if (e.ChangeType == WatcherChangeTypes.Deleted)
{
OnDeleted(source, e);

}
else
{
OnOther(source, e);
}
}

private static void OnCreated(object source, FileSystemEventArgs e)
{

Console.WriteLine("新建");

}

private static void OnChanged(object source, FileSystemEventArgs e)
{

Console.WriteLine("改变");
}

private static void OnDeleted(object source, FileSystemEventArgs e)
{

Console.WriteLine("删除");
}

private static void OnRenamed(object source, RenamedEventArgs e)
{

Console.WriteLine("重命名");
}
private static void OnOther(object source, FileSystemEventArgs e)
{

Console.WriteLine("其他");

}
private static void OnError(object source, ErrorEventArgs e)
{

Console.WriteLine("错误" + e.GetException());

}

#endregion
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: