C# 监听文件系统变化(FileSystemWatcher)

FileSystemWatcher常用来监听文件系统中的文件或者文件夹的变化。

一、常用事件

Changed: 当文件或者文件夹发生修改时触发
Created:当文件或者文件夹成功创建时触发
Deleted:当文件或者文件夹成功删除时触发
Renamed:当文件或者文件夹被重命名时触发
Error:当变更的过程中发生错误触发

二、基本属性

(1) Path :设置要监视的目录的路径。
(2) IncludeSubdirectories :设置是否级联监视指定路径中的子目录。
(3) Filter :设置筛选字符串,用于确定在目录中监视哪些类型的文件。
(4) NotifyFilter :设置文件的哪些属性的变动会触发 Changed事件,同时监控多个属性变动可以按“或”组合。(默认值为 NotifyFilter.LastWrite | NotifyFilter.FileName | NotifyFilter.DirectoryName 组合)
(5) EnableRaisingEvents :设置是否开始监控。(默认为false)

NotifyFilters的属性如下:

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

三、代码示例

    private static void FileWatcher(string path, string filter)
    {
    
    
      FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
      fileSystemWatcher.Path = path;
      fileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess 
                                     | NotifyFilters.LastWrite 
      								 | NotifyFilters.FileName 		   
      								 |NotifyFilters.DirectoryName;
       //文件类型,支持通配符,“*.txt”只监视文本文件
      fileSystemWatcher.Filter = filter;    // 监控的文件格式
      watch.IncludeSubdirectories = true;  // 监控子目录
      fileSystemWatcher.Changed += new FileSystemEventHandler(OnProcess);
      fileSystemWatcher.Created += new FileSystemEventHandler(OnProcess);
      fileSystemWatcher.Renamed += new RenamedEventHandler(OnRenamed);
      fileSystemWatcher.Deleted += new FileSystemEventHandler(OnProcess);
      //表示当前的路径正式开始被监控,一旦监控的路径出现变更,FileSystemWatcher 中的指定事件将会被触发。
      fileSystemWatcher.EnableRaisingEvents = true;
    }
	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);
    	} 
	}

	private static void OnCreated(object source, FileSystemEventArgs e)
    {
    
    
      Console.WriteLine("File created: {0} {1} {2}", e.ChangeType, e.FullPath, e.Name);
    }

    private static void OnChanged(object source, FileSystemEventArgs e)
    {
    
    
      Console.WriteLine("File changed: {0} {1} {2}", e.ChangeType, e.FullPath, e.Name);
    }

    private static void OnDeleted(object source, FileSystemEventArgs e)
    {
    
    
      Console.WriteLine("File deleted: {0} {1} {2}", e.ChangeType, e.FullPath, e.Name);
    }

	private static void OnRenamed(object source, FileSystemEventArgs e)
    {
    
    
      Console.WriteLine("File renamed: {0} {1} {2}", e.ChangeType, e.FullPath, e.Name);
    }

总结

1、重命名会触发两个事件,Renamed和Changed。
2、FileSystemWatcher类本身就是多线程的控件,每实例化一个FileSystemWatcher自动就会创建一条线程。
3、创建、修改、删除事件传递的是FileEventArgs对象,而重命名事件传递的是RenameEventArgs对象。
4、如果需要同时监控多个文件,需要创建FileSystemWatcher数组,每个文件用一个FileSystemWatcher进行监控。

DateTime 微软官方文档

猜你喜欢

转载自blog.csdn.net/qq_38318701/article/details/128406759