曾经在研究这么一个工具,当优盘等移动设备插入电脑时,后台程序自动复制优盘内的某些文件到电脑,或者是复制当前电脑内的指定文件到优盘。也使用过C# + WinForm实现了前一个功能,但也由于设计时结构化程度太强,代码太多就不易维护。同时,原始设计可移植性性不强,比如如果要定制要复制文件类型,每次需要重新编译源代码,而且在异常处理,逻辑结构上也不易于后期维护。
因此,结合OO设计思想和Strategy设计模式,重构了之前了代码。代码已发布在CodePlex上(下载地址见最后),代码设计方案请查看wiki,现简单地说一下使用方法:
(1)打开Visual Studio 新建Windows窗体应用程序(C# + .NET 4),把下载下来的程序集CoreLib.dll、UILib.dll以及ZipLib.dll添加到当前引用(如图)
(2)在Form1类上添加命名空间引用,并为此类添加父类,代码如下
1 using Somnus.Windows.Forms; 2 using Somnus.IO; 3 using Somnus.IO.Compression; 4 namespace Demo 5 { 6 //父类提供了移动设备插入时的事件,待会实现其即可 7 public partial class Form1 : EventedForm 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 } 14 }
(3)现在这个窗口类就多了一个事件InsertNew,该事件会在插入移动存储设备时触发,如图
添加事件处理程序,代码如下
1 private void Form1_InsertNew(object sender, EventArgs e) 2 { 3 //获取当前系统已有的移动存储设备 4 UsbDrive[] allDrives = UsbDrive.GetDrives(); 5 //设置处理行为类,优盘到硬盘,初始化复制文件类型 6 CopyToHDBehavior behavior = new CopyToHDBehavior(".txt|.docx|.doc|.xls"); 7 //设置目的地路径,默认设置为系统盘目录下 8 /*behavior.DestinationPath = @"E:\"*/; 9 foreach (UsbDrive drive in allDrives) 10 { 11 try 12 { 13 //开始处理 14 drive.PerformBehavior(behavior); 15 } 16 catch (System.Exception ex) 17 { 18 MessageBox.Show(ex.Message); 19 } 20 } 21 }
这样在系统盘目录下就声称一个MD5值为文件夹名,内容为复制的文件的文件夹。(优盘目录下会生成签名文件sig.xml,具体请查看wiki)当然,如果是要从硬盘复制到优盘,代码就照例更改如下
1 private void Form1_InsertNew(object sender, EventArgs e) 2 { 3 //获取当前系统已有的移动存储设备 4 UsbDrive[] allDrives = UsbDrive.GetDrives(); 5 //设置处理行为类,硬盘到优盘,初始化复制文件类型 6 CopyFromHDBehavior behavior = new CopyFromHDBehavior(".txt|.doc"); 7 //设置排除的磁盘卷,如排除D盘和E盘,默认设置包括硬盘所有卷 8 /*behavior.ExcludedDiskNames = "D:|E:";*/ 9 //设置是否包括其他磁盘,默认设置为不包括其他卷,只包括当前用户桌面 10 /*behavior.IsIncludedOtherVolumes = true;*/ 11 12 foreach (UsbDrive drive in allDrives) 13 { 14 try 15 { 16 //开始处理 17 drive.PerformBehavior(behavior); 18 } 19 catch (System.Exception ex) 20 { 21 MessageBox.Show(ex.Message); 22 } 23 } 24 }
优盘目录下生成由扫描电脑后所得文件的压缩包。
(4)窗体还可以做其它外观设置,比如窗体加载时是否显示等,还请大家进一步优化。
文件下载地址:https://somnus0208.codeplex.com/
Somnus.V
本作品采用知识共享署名-相同方式共享 2.5 中国大陆许可协议进行许可。