【C# IO操作】 文件系统侦听 FileSystemWatcher
侦听器 :
FileSystemWatcher
- FileSystemWatcher常用属性有:
- Filter :获取或设置用于确定目录中要监视哪些文件的过滤器字符串。Filter 属性设置为空字符串 ("") 或使用通配符(“*.*”)。若要监视特定的文件,请将 Filter 属性设置为该文件名。例如,若要监视文件 MyDoc.txt 中的更改,请将 Filter 属性设置为“MyDoc.txt”。也可以监视特定类型文件中的更改。例如,若要监视文本文件中的更改,请将 Filter 属性设置为“*.txt”。
- IncludeSubdirectories:获取或设置是否监控被监控目录的子目录。
- InternalBufferSize:内部缓冲区大小,最大为64K(侦听网络时候用),默认为8K。
- path:需要监控的文件夹路径
- NotifyFilter:获取或设置哪些内容改变后需要被捕获,可设置的类型如下:
|
类型 |
说明 |
|---|---|
|
Attributes |
文件或文件夹的属性 |
|
CreationTime |
文件或文件夹的创建时间 |
|
DirectoryName |
目录名称 |
|
FileName |
文件名 |
|
LastAccess |
最后访问时间 |
|
LastWrite |
最后修改时间 |
|
Security |
安全设置 |
|
Size |
大小 |
使用 FileSystemWatcher 类时,请注意以下事项。
1) 对包括隐藏文件(夹)在内的所有文件(夹)进行监控。
2) 您可以为 InternalBufferSize 属性(用于监视网络上的目录)设置的最大大小为 64 KB。
枚举:
WatcherChangeTypes
子项:All -- 文件或文件夹的创建、删除、更改或重命名。
Changed -- 文件或文件夹的更改。更改的类型包括大小、属性、安全设置、最近写入时间和最近访问时间方面的更改。
Created -- 文件或文件夹的创建。
Deleted -- 文件或文件夹的删除。
Renamed -- 文件或文件夹的重命名。
事件参数:
FileSystemEventArgs
ErrorEventArgs
RenamedEventArgs
FileSystemEventArgs 对象:
成员: Name: 获取受影响的文件或目录的名称。 注意:如果是级联监控子目录的话,该值为从监控目录的下个目录到受影响的文件的路径,而不只是受影响的文件名。
FullPath : 获取受影响的文件或目录的完全限定的路径。
ChangeType :获取受影响的文件或目录的发生的事件类型。
RenamedEventArgs 对象:
成员: Name: 获取受影响的文件或目录的新名称。
OldName : 获取受影响的文件或目录的旧名称。
FullPath : 获取受影响的文件或目录的完全限定的路径。
OldFullPath : 获取受影响的文件或目录的前一个完全限定的路径。
ChangeType :获取受影响的文件或目录的发生的事件类型。
事件委托:
FileSystemEventHandler
ErrorEventHandler
RenamedEventHandler
class FileSystemWatcherTest { static void Main() { #region 新建文件夹和文件 //把桌面设置为当前目录 Directory.SetCurrentDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); //在当前目录新建文件夹 DirectoryInfo directoryInfo = new DirectoryInfo("WatcherTest"); directoryInfo.Create(); //显示当前目录 Console.WriteLine(Environment.CurrentDirectory); //在WatcherTest 目录新建文件 FileInfo fileInfo = new FileInfo(Path.Combine(directoryInfo.Name, "readme.txt")); var filestream= fileInfo.Create(); //关闭文件流 filestream.Close(); //创建子文件夹 DirectoryInfo subinfo = directoryInfo.CreateSubdirectory("sub"); subinfo.Create(); //在子文件夹sub下创建 文件sub2.txt FileInfo subinfo2 = new FileInfo(Path.Combine(subinfo.FullName, "sub2.txt")); FileStream subfs = subinfo2.Create(); subfs.Close();// 在删除文件之前必须删除FileSteam #endregion #region 监听刚刚新建的文件夹和文件 变更情况 using var watcher = new FileSystemWatcher(directoryInfo.FullName); watcher.Filter = "*.txt"; watcher.NotifyFilter = NotifyFilters.Security | NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size; /* watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;*/ watcher.Changed += Changed; watcher.Created += Created; watcher.Renamed += Renamed; watcher.Deleted += Deleted; watcher.Error += Error; //是否侦听子目录 watcher.IncludeSubdirectories = true; //允许触发侦听事件 watcher.EnableRaisingEvents = true; while (Console.Read()!='q') ; watcher.Dispose(); #endregion } private static void Error(object sender, ErrorEventArgs e) { Console.WriteLine($"Error:{0}", e.ToString()); } private static void Deleted(object sender, FileSystemEventArgs e) { Console.WriteLine($"{e.Name} is Deleted"); } private static void Renamed(object sender, RenamedEventArgs e) { Console.WriteLine($"{e.OldName} Renamed :{e.Name}"); } private static void Created(object sender, FileSystemEventArgs e) { Console.WriteLine($"{e.Name} Created :{e.FullPath}"); } private static void Changed(object sender, FileSystemEventArgs e) { if(e.ChangeType == WatcherChangeTypes.Changed) Console.WriteLine($"{e.Name}Changed:{e.FullPath}"); } }