C# 監測可移動磁盤插入与文件复制

背景:程式启动后,用于将插入服务器的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.文件夹复制

C# 監測可移動磁盤插入与文件复制
 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         }
View Code

 

(代碼與資料來源均參考博客園,因搜索記錄較多,如有原作者路过,请让我看到后,将于原文备注源地址,感謝!)

C# 監測可移動磁盤插入与文件复制

上一篇:Golang 设计模式 学习笔记(六)命令模式


下一篇:WebApi认证刷选器获取Post参数