背景:程式启动后,用于将插入服务器的U盘里面的文件复制至共享文件夹(程式自启动可使用电脑的排程来设置)
主要通过重写WndProc函数,用于捕获系统运行返回消息。Wndproc是Windows操作系统向应用程序发送一系列消息之一,每个窗口会有一个窗口过程的回调函数,分别是窗口句柄、消息ID
1.监测U盘插入
1 public const int WM_DEVICECHANGE = 0x219;//U盘插入后,OS的底层会自动检测到,然后向应用程序发送“硬件设备状态改变“的消息 2 public const int DBT_DEVICEARRIVAL = 0x8000;//表示U盘可用的 3 public const int DBT_CONFIGCHANGECANCELED = 0x0019;//要求更改当前的配置(或取消停靠码头)已被取消 4 public const int DBT_CONFIGCHANGED = 0x0018;//当前的配置发生了变化,由于码头或取消固定。 5 public const int DBT_CUSTOMEVENT = 0x8006;//自定义的事件发生。 的Windows NT 4.0和Windows 95:此值不支持 6 public const int DBT_DEVICEQUERYREMOVE = 0x8001; //审批要求删除一个设备或媒体作品。任何应用程序也不能否认这一要求,并取消删除。 7 public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;//请求删除一个设备或媒体片已被取消。 8 public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;//一个设备或媒体片已被删除。 9 public const int DBT_DEVICEREMOVEPENDING = 0x8003;//一个设备或媒体一块即将被删除。 10 public const int DBT_DEVICETYPESPECIFIC = 0x8005;//一个设备特定事件发生。 11 public const int DBT_DEVNODES_CHANGED = 0x0007;//一种设备已被添加到或从系统中删除。 12 public const int DBT_QUERYCHANGECONFIG = 0x0017;//要求改变目前的配置 13 public const int DBT_USERDEFINED = 0xFFFF;//此消息的含义是用户定义的 14 15 #region 設備檢測 16 protected override void WndProc(ref Message m) 17 { 18 try 19 { 20 if (m.Msg == WM_DEVICECHANGE) 21 { 22 switch (m.WParam.ToInt32()) 23 { 24 case WM_DEVICECHANGE: 25 break; 26 case DBT_DEVICEARRIVAL://USB插入 27 DriveInfo[] s = DriveInfo.GetDrives(); 28 foreach (DriveInfo drive in s) 29 { 30 //黨磁盤驅動為可移動存儲設備或CD光驅時,開始copy文件 31 //if (drive.DriveType == DriveType.Removable || drive.DriveType == DriveType.CDRom) 32 if (drive.DriveType == DriveType.CDRom && drive.IsReady==true)//僅讀取光盤設備文件 33 { 34 Console.WriteLine(DateTime.Now.ToString()); 35 Thread.Sleep(1000); 36 if (!isCopyEnd) 37 { 38 isCopy = true; 39 listBox1.Items.Add(DateTime.Now.ToString() + "--已讀取到設備,準備複製文件..."); 40 lbl_status.Text = "正在複製文件,請稍後..."; 41 CopyFile(drive.Name.ToString()); 42 } 43 break; 44 } 45 } 46 break; 47 case DBT_CONFIGCHANGECANCELED: 48 break; 49 case DBT_CONFIGCHANGED: 50 break; 51 case DBT_CUSTOMEVENT: 52 break; 53 case DBT_DEVICEQUERYREMOVE: 54 break; 55 case DBT_DEVICEQUERYREMOVEFAILED: 56 break; 57 case DBT_DEVICEREMOVECOMPLETE://U盤卸載 58 listBox1.Items.Add(DateTime.Now.ToString() + "--設備已移除,準備下一次工作。"); 59 lbl_status.Text = "尋找設備信息..."; 60 isCopy = false; 61 isCopyEnd = false; 62 break; 63 case DBT_DEVICEREMOVEPENDING: 64 break; 65 case DBT_DEVICETYPESPECIFIC: 66 break; 67 case DBT_DEVNODES_CHANGED: 68 break; 69 case DBT_QUERYCHANGECONFIG: 70 break; 71 case DBT_USERDEFINED: 72 break; 73 default: 74 break; 75 } 76 } 77 } 78 catch (Exception ex) 79 { 80 listBox1.Items.Add("ERROR!" + ex.Message); 81 } 82 base.WndProc(ref m); 83 } 84 #endregion
2.文件夹复制
1 /// <summary> 2 /// 複製文件 3 /// </summary> 4 /// <param name="srcPath">源路徑</param> 5 /// <param name="desPath">目標路徑</param> 6 public void CopyFile(string srcPath,string desPath) 7 { 8 string folderName = srcPath.Substring(srcPath.LastIndexOf("\\") + 1); 9 10 string desfolderdir = desPath +"\\"; 11 12 string[] filenames = Directory.GetFileSystemEntries(srcPath); 13 //遍歷文件與目錄 14 foreach (string subFile in filenames) 15 { 16 //如果是文件夾則遞歸copy該目錄下的文件 17 if (Directory.Exists(subFile)) 18 { 19 string currentDir = desfolderdir + "\\" + subFile.Substring(subFile.LastIndexOf("\\")+1); 20 if (!Directory.Exists(currentDir)) 21 Directory.CreateDirectory(currentDir); 22 CopyFile(subFile, currentDir); 23 } 24 else//否則直接copy文件 25 { 26 string FileName = subFile.Substring(subFile.LastIndexOf("\\") + 1); 27 string desFileName = desfolderdir + FileName; 28 if (!Directory.Exists(desfolderdir)) 29 Directory.CreateDirectory(desfolderdir); 30 try 31 { 32 ////判断文件封存或只读属性 33 //if (File.GetAttributes(subFile).ToString().IndexOf("Archive") >= 0) 34 //{ 35 // // File.SetAttributes(subFile, FileAttributes.Normal); 36 // FileInfo er = new FileInfo(subFile); 37 // er.Attributes = FileAttributes.Normal; 38 //} 39 File.Copy(subFile, desFileName,true); 40 } 41 catch (Exception e) 42 { 43 //continue; 44 lbl_status.Text = e.Message; 45 return; 46 } 47 } 48 49 } 50 }
(代碼與資料來源均參考博客園,因搜索記錄較多,如有原作者路过,请让我看到后,将于原文备注源地址,感謝!)