Second Copy®是一个强大的自动备份工具,我曾用他来做文件同步和网页防篡改,支持ftp、email通知、定时等,功能非常不错。

C#中正好也提供了一个有监视功能的FileSystemWatcher,我们用他来监视本地文件或子目录的变化,然后将变化的文件即时反馈到你的目标存储即可,我给这个小玩意取了一个名字,叫BakCopy,下面简单说下思路

1、建立BakCopy任务,任务属性包括名称、源目录、目标目录、监视文件类型、是否监视子目录,

将任务属性保存在config.ini文件中,格式如下,一个ini文件中可以保存多个任务。autostart表示是否在启动程序时自动启动监视任务。

2、在显示主界面时,读取ini文件,显示所有任务,显示所有任务的状态。autostart=1的任务自动启动,并在窗口下方显示log。

3、右击任务时显示popmenu,可以启动、停止、修改任务。

4、启动任务时,采用多线程调用监视类FileCopyThread。

5、FileCopyThread中监视到有create、delte、rename、change等时间时,进行相应的copyfile操作,并在log里显示。

------------------------------------------------------------

FileCopyThread类:

1 using System;
2  using System.Collections.Generic;
3  using System.Text;
4  using System.IO;
5  using System.Security.Permissions;
6
7  namespace BakCopy
8 {
9 class FileCopyThread
10 {
11 private FileSystemWatcher fsw;
12 private string srcDir = "";
13 private string dstDir = "";
14 private string fileType = "*.*";
15 private bool includeSubdir = false;
16
17 [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
18 public FileCopyThread(string srcDir, string dstDir, string fileType, bool includeSubdir)
19 {
20 this.srcDir = srcDir;
21 this.dstDir = dstDir;
22 this.fileType = fileType;
23 this.includeSubdir = includeSubdir;
24
25 this.fsw = new FileSystemWatcher();
26 this.fsw.Path = this.srcDir;
27 this.fsw.Filter = this.fileType;
28 this.fsw.EnableRaisingEvents = false;
29 this.fsw.IncludeSubdirectories = this.includeSubdir;
30 }
31
32 public void run()
33 {
34 this.fsw.Changed += new FileSystemEventHandler(this.fsw_Changed);
35 this.fsw.Created += new FileSystemEventHandler(this.fsw_Created);
36 this.fsw.Deleted += new FileSystemEventHandler(this.fsw_Deleted);
37 this.fsw.Renamed += new RenamedEventHandler(this.fsw_Renamed);
38 this.fsw.EnableRaisingEvents = true;
39 Console.WriteLine("FileCopyThread.run={0} HashCode={1}", System.Threading.Thread.CurrentThread.Name, this.GetHashCode());
40 }
41
42 private void fsw_Changed(object sender, FileSystemEventArgs e)
43 {
44 Console.WriteLine("Change File: " + e.FullPath + " " + e.ChangeType);
45 //TODO copy file here
46   }
47
48 private void fsw_Created(object sender, FileSystemEventArgs e)
49 {
50 this.fsw_Changed(sender, e);
51 //TODO copy file here
52   }
53
54 private void fsw_Deleted(object sender, FileSystemEventArgs e)
55 {
56 Console.WriteLine("Delete File: " + e.FullPath + " " + e.ChangeType);
57 //TODO delete file here
58   }
59
60 private void fsw_Renamed(object sender, RenamedEventArgs e)
61 {
62 Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
63 //TODO rename file here
64  
65 }
66
67 ~FileCopyThread()
68 {
69 this.fsw.EnableRaisingEvents = false;
70 Console.WriteLine("~FileCopyThread={0} HashCode={1}", System.Threading.Thread.CurrentThread.Name, this.GetHashCode());
71 }
72 }
73 }
74
75  

------------------------------------------------------------

启动任务:

1 // start thread
2  Thread myThread = new Thread(new ThreadStart(new FileCopyThread(srcDir, dstDir, filetype, subdir).run));
3 myThread.IsBackground = true;
4 myThread.Name = taskname;
5 myThread.Start();
6  this.threadNameTable.Add(taskname, myThread);

------------------------------------------------------------

停止任务:

1 //stop it
2  foreach (DictionaryEntry de in this.threadNameTable)
3 {
4 if (de.Key.ToString() == taskname)
5 {
6 //Thread th = (Thread)this.threadNameTable[taskname];
7   Thread th = (Thread)de.Value;
8 th.Join();
9 th.Abort();
10 this.threadNameTable.Remove(taskname);
11 break;
12 }
13 }

------------------------------------------------------------

问题:

启动任务后,调用了FileCopyThread.run,目录监视开始了,见线程对象加到一个列表中。在需要停止任务时,从列表中获取线程,然后将其停止掉。但是Thread.Abort()终止线程后,并没有调用到FileCopyThread的析构函数,也就是任务结束后,目录监视仍然存在。

好像我的这个写法有点问题,大侠指点下。

------------------------------------------------------------

后续工作:

才做了一个壳子,后面得完善copyfile,加入系统托盘,定时器,支持ftp,email通知等,慢慢来吧。

附件:http://files.cnblogs.com/longware/BakCopy.rar

转载于:https://www.cnblogs.com/longware/archive/2010/07/08/1773874.html

用FileSystemWatcher实现山寨版Second Copy [1]相关推荐

  1. 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)

    在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...

  2. [习题]综合练习 -- SqlDataSource精灵就能完成,[山寨版] Dynamic Data WebSite

    这是我的文章备份,有空请到我的网站走走, http://www.dotblogs.com.tw/mis2000lab/ 才能掌握我提供的第一手信息,谢谢您.   http://www.dotblogs ...

  3. 关于FileSystemWatcher类

    类:System.IO.FileSystemWatcher 首次接触到这个类是在这样的一个用户需求中: 当时需要用一个路径导入资料进DB,导入成功后清除文件:本来新建了一个测试的文件夹,但是文件进来的 ...

  4. 手写一个山寨版的springmvc框架

    文章目录 一,环境准备 二,项目结构搭建 三,简易版的前端控制器 DnDispatcherServlet 四,测试springmvc的性能 五,结束语 首先贴出来一张从网上copy下来的 spring ...

  5. FileSystemWatcher 类

    命名空间: System.IO 程序集: System.IO.FileSystem.Watcher.dll, System.dll, netstandard.dll 侦听文件系统更改通知,并在目录或目 ...

  6. C#WinForm使用FileSystemWatcher监测文件定时读取

    1.在WinForm中 加入FileSystemWatcher控件      2.实例化FileSystemWatcher对象 public void FileWatche(){FileSystemW ...

  7. Docker 入门系列(7)- Dockerfile 使用(FROM、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、WORKDIR)

    Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 来快速创建自定义的镜像. 1. 基本结构 Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行. ...

  8. torch中的copy()和clone()

    torch中的copy()和clone() 1.torch中的copy()和clone() y = torch.Tensor(2,2):copy(x) --- 1 修改y并不改变原来的x y = x: ...

  9. Go 学习笔记(11)— 切片定义、切片初始化、数组和切片差异、字符串和切片转换、len()、cap()、空 nil 切片、append()、copy() 函数、删除切片元素

    1. 切片定义 Go 语言切片是对数组的抽象. Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容 ...

最新文章

  1. 实时获取ccd图像_薄膜瑕疵在线检测系统0.1mm检测精度_实时在线检测
  2. CentOS 7.X 安装 Gitlab 笔记
  3. 6.exit _exit _Exit
  4. Centos 开机后,登录时无法输入密码怎么解决
  5. 安装VS2008错误解决
  6. 打印出来只有a4纸一半 预览是正常的_还需要去打印店?能随身使用的便携打印机:汉印MT800评测...
  7. java 泛型对象实例化_java泛型对象的实例化
  8. K2P路由器刷机和拨号上网
  9. 中望3d快捷键命令大全_autocad2014快捷键命令大全
  10. ui-grid 使用讲解
  11. 在线可视化布局HTML
  12. 第一课 程小奔之晃一晃
  13. 【饭谈】谈谈所有人都曾经对测开技术的迷茫和恐惧
  14. python模块xlutils如何下载_Python-如何安装xlutils?
  15. 浅析NDI 5(一)基于NDI 5如何打造全球NDI演播室?
  16. vue中使用电子签名
  17. 戴尔se2717h 怎么拆支架
  18. 软件开发:最佳实践 != 过度设计
  19. 技术揭秘 | 互联网广告黑产盛行,如何反作弊?
  20. break 跳出两层甚至多层 for 循环

热门文章

  1. 拍照翻译 轻松一拍 轻松翻译 云脉慧眼
  2. iphone系统崩溃数据能恢复吗?教你三招方法
  3. 浏览器利用框架BeEF测试-成功截取微博账号
  4. mysql5.7 mysqladmin_mysql 内部命令使用和mysqladmin用法
  5. 跨境电商的发展趋势有哪些?跨境电商发展现状与趋势
  6. windows安装tomcat
  7. jquery兄弟标签_jQuery获取父级、兄弟节点的方法
  8. 假设检验与P值的理解
  9. 【机器学习】Lasso模型
  10. iOS恢复QQ音乐等播放器中断