• FileSystemWatcher类监控文件的更改状态并且实时备份文件


    首先这是我自己在一个任务需求里面所要用到的,大致的代码如下:我把监视文件和备份文件的方法封装到一个WatcherAndBackup

    类中了,但是总感觉封装的不是很好,有大牛能够指出改正之处在此留言,谢谢指点了哈!!,主要监视文件用到的类就是在sysytem.IO

    里面的FileSystemWatcher,然后在一个控制台里面创建类WatcherAndBackup的实例并且运行就行

     1  class WatcherAndBackup
     2     {
     3         string sourcefile = "";//源文件
     4         string targetfile = "";//目标文件
     5         string targetPath = "";//目标路径
     6         public WatcherAndBackup(string Sourcefile,string Targetfile,string TargetPath)
     7         {
     8             sourcefile = Sourcefile;targetfile = Targetfile;targetPath = TargetPath;
     9         }
    10        
    11         public void backup(string sourcefile,string targetfile,string targetPath)
    12         {
    13             try
    14             {
    15                 if (!Directory.Exists(targetPath))
    16                 {
    17                     Directory.CreateDirectory(targetPath);
    18                     
    19                 }
    20                 File.Copy(sourcefile, targetfile, true);
    21 
    22             }
    23             catch { }
    24         }
    25         #region 实时监视文件更改并且备份文件
    26         public void watcherfile(string path,string file)
    27         {
    28             FileSystemWatcher fsw = new FileSystemWatcher(path, file);
    29             fsw.Changed += new FileSystemEventHandler(change_watcher);
    30             fsw.Created += new FileSystemEventHandler(change_watcher);
    31             fsw.Deleted += new FileSystemEventHandler(change_watcher);
    32             fsw.Renamed += new RenamedEventHandler(rename_watcher);
    33             fsw.EnableRaisingEvents = true;
    34             Console.WriteLine("开始监视。。。。");
    35             fsw.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName
    36                 | NotifyFilters.LastAccess | NotifyFilters.Security | NotifyFilters.Size | NotifyFilters.LastWrite;
    37             fsw.IncludeSubdirectories = true;
    38         }
    39         public void change_watcher(object sender,FileSystemEventArgs e)
    40         {
    41            
    42             var wacher = sender as FileSystemWatcher;
    43             wacher.EnableRaisingEvents = false;
    44             
    45             if (e.ChangeType==WatcherChangeTypes.Changed)
    46             {
    47                 Console.WriteLine("正在备份。。。");
    48                     backup(sourcefile,targetfile,targetPath);
    49                     Console.WriteLine("备份成功。。。");
    50                                
    51             }
    52             else if (e.ChangeType==WatcherChangeTypes.Created)
    53             {
    54                 Console.WriteLine("{0},{1},{2}", e.ChangeType, e.FullPath, e.Name);
    55                 return;
    56             }
    57             else if (e.ChangeType==WatcherChangeTypes.Deleted)
    58             {
    59                 Console.WriteLine("{0},{1},{2}", e.ChangeType, e.FullPath, e.Name);
    60                 return;
    61             }
    62             wacher.EnableRaisingEvents = true;
    63         }
    64         public void rename_watcher(object sender,RenamedEventArgs e)
    65         {
    66             Console.WriteLine("{0},{1},{2}", e.ChangeType, e.FullPath, e.Name);
    67         }
    68         #endregion
    69 
    70     }
     static void Main(string[] args)
            {
                WatcherAndBackup bk = new WatcherAndBackup(@"D:ggconfig.xml", @"D:ggackupconfig.xml", @"D:ggackup");
                bk.watcherfile(@"D:gg", "config.xml");//监视的文件为D:ggconfig.xml
                Console.Read();         
            }
    

     在这里解释一下:实例类WatcherAndBackup时分别要写下backup方法的三个参数:sourcefile、targefile、targePath,也就是备份方法的源文件、目标文件、目标文件的目录,然后在change_watcher方法当中为什么会有这几局代码:

    var wacher=sender as FileSystemWatcher;

    wacher.EnableRaisingEvents=false;

    然后在方法后面:

    wacher.EnableRaisingEvents=true;

    其实如果不加入这几句代码会出现当监控到文件修改时会触发两次changed方法,这个修改方法是我在网上找到的一个修改方法

    好了,基本也说完了。。。有什么不正确的地方请各位大牛指正,本就打着学习的态度写下的。。嘿嘿!!

    
    

  • 相关阅读:
    bash 复制文件
    taro 异步请求与列表渲染
    get请求带body的formdata非json实现AsyncHttpClient解决
    vue These dependencies were not found: * corejs/modules/es.array.iterator in ./node_modules/@babe
    Java HttpClient中文乱码解决
    SpringBoot参数校验及异常捕获
    MAC在Chrome安装vue插件
    HttpClient工具类(包含请求头header设置token)
    SpringBoot解决跨域
    2021 BDCI 华为零售商品识别竞赛一等奖方案分享
  • 原文地址:https://www.cnblogs.com/ryzen/p/8117736.html
Copyright © 2020-2023  润新知