【C# IO操作】 文件系统侦听 FileSystemWatcher


侦听器 :
FileSystemWatcher

  1. 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}");
       


    }
}
C