• FileSystemWatcher监视文件变动


    模拟一下如何去监视指定的目录的变动。

            1、通过Timer来间隔检测文件夹中的变动,主要是对最后时间进行判断。?

            2、能否基于系统提供的Api或类库来实现监视
            显然,对于第一种方案是很不科学,也很不好把控的。如果用timer那么将会占用过多的资源,同时对于变动不能很明确的定位,在过深层级下的文件变动通过这种方式将很难遍历到,即便能够遍历到则其中的遍历也会增加系统的复杂度。

             然而在Net提供的类中有一个System.IO.FileSystemWatcher 通过命名就可以看出其功效——监视者。于是按照自己的思路进行Demo的编写。

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     using System.IO;
     namespace FileWatch
      {
         class Program
          {
            static void Main(string[] args)
            {
                //用于输入需要监听的路径 例如 c:\
                string s = Console.ReadLine();
                new FileWatchClass(s);
                Console.ReadKey();
            }
        }

        class FileWatchClass
        {
            System.IO.FileSystemWatcher FileWatcher = new FileSystemWatcher ();
            public FileWatchClass(string WatcherPath)
            {
                FileWatcher.Filter = "*.*"//设定监听的文件类型
                FileWatcher.Path = WatcherPath; //设定监听的目录
                FileWatcher.Changed += new FileSystemEventHandler(FileWatcher_Changed); //Changed 事件处理
                FileWatcher.Renamed += new RenamedEventHandler(FileWatcher_Renamed);//Renamed事件处理
                FileWatcher.Created += new FileSystemEventHandler(FileWatcher_Created);//Created事件处理
                FileWatcher.Deleted += new FileSystemEventHandler(FileWatcher_Deleted);//Deleted事件处理
                FileWatcher.IncludeSubdirectories = true;//设置监听子目录
                FileWatcher.EnableRaisingEvents = true;//开始进行监听(其实此处是标示是否进行事件监听和抛出)
            }

           void FileWatcher_Deleted(object sender, FileSystemEventArgs e)
            {
                Console.WriteLine(""+e.ChangeType+""+e.FullPath+" 删除 ");
            }

            void FileWatcher_Created(object sender, FileSystemEventArgs e)
            {
                Console.WriteLine("" + e.ChangeType + "" + e.FullPath + " 被创建 ");
            }

            void FileWatcher_Renamed(object sender, RenamedEventArgs e)
            {
                Console.WriteLine("" + e.ChangeType + "" + e.OldFullPath + " 由原来名 " + e.OldName + " 改名为 " + e.Name);
            }

            void FileWatcher_Changed(object sender, FileSystemEventArgs e)
            {
                Console.WriteLine("" + e.ChangeType + "" + e.FullPath + " 发生改变 ");
            }
        }
    }

    编译这个Demo,我们来进行测试一下。原来本打算只是实现功能,当测试时突然发现了系统在处理文件时的一些小信息:

    1、同级目录内复制文件(Test.txt) 结果为(捕获到 一次创建,两次改变):

    【Created】c:\复制Test.txt  被创建
    【Changed】c:\复制Test.txt  发生改变
    【Changed】c:\复制Test.txt  发生改变

    2、非同级目录复制(Test.txt 复制到 Test文件夹下面)  结果为(捕获到 一次创建,两次改变+一次文件夹改变):

    【Created】c:\Test\Test.txt  被创建
    【Changed】c:\Test\Test.txt  发生改变
    【Changed】c:\Test\Test.txt  发生改变
    【Changed】c:\Test  发生改变

    3、非同级的剪切 粘贴(Test.txt 剪切到 Test 文件夹下)结果为(捕获到 一次删除  一次创建 一次文件夹改变):

    【Deleted】c:\Test.txt  删除
    【Created】c:\Test\Test.txt  被创建
    【Changed】c:\Test  发生改变

    可以看出一个小问题,对于未建立的文件,在创建时在创建后会出现两次Changed,然而对于已经存在的文件移动在另一个目的地时没有那“多余”的两次Changed 这是为什么呢

  • 相关阅读:
    USACO 2017 US Open Contest Gold T1: Bovine Genomics
    自己瞎调的一些曲子
    NOIP前要干的一些事
    【[BJOI2018]链上二次求和】
    【MdOI2020】Path
    【[SDOI2018]旧试题】
    [IOI2018]werewolf狼人
    洛谷p5444 [APIO2019]奇怪装置
    洛谷p4211 [LNOI2014] LCA
    洛谷P2805 [NOI2009] 植物大战僵尸
  • 原文地址:https://www.cnblogs.com/northstar/p/FileSystemWatcher.html
Copyright © 2020-2023  润新知