如何检测USB驱动器已插入?

我想build立一个程序,检测一个USB(或两个或更多)是否插入(并将所有内容复制到硬盘上的任何文件夹)

有任何想法吗? 我有这个,

using System.Runtime.InteropServices; 

但是这不是一个简单的方法(我相信)。 我想要简单的东西。

我有另一个想法(如果(文件夹存在),然后复制)的东西 – 但可能有一个问题,我想要一个很好的解决scheme。

也可能有一个称为SerialPort的工具; 我可以使用它吗? 如果是这样,我该如何使用它?

检查可移动设备很容易,但不能保证它是USB设备:

 var drives = DriveInfo.GetDrives() .Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable); 

这将返回当前可访问的所有可移动设备的列表。 更多信息:

  • DriveInfo类 (msdn文档)
  • DriveType枚举 (msdn文档)

检测USB驱动器是否被插入并不简单。 但是,这绝对是可能的,工作已经完成了。 这里有两个链接,每个详细的答案如何在C#中做到这一点:

http://www.codeproject.com/KB/system/DriveDetector.aspx

http://www.codeproject.com/Messages/2126647/Re-Csharp-USB-Detection.aspx

这两种解决scheme应该适合你。 您可以调整它们以适应您的需求。

编辑:这是第三个解决scheme,如果你想要更多的select(基本上他们都是一样的,但select是好的,对吗?):

http://tempuzfugit.wordpress.com/2007/10/08/external-storage-unit-detection-with-c-in-net-usb-card-readers-etc/

这是一个代码,适合我,这是从上面的网站的一部分结合我的早期试验: http : //www.codeproject.com/KB/system/DriveDetector.aspx

这基本上使您的窗体听取窗口消息,filter的USB驱动器和(cd-dvd),抓取消息的lparam结构,并提取驱动器号。

 protected override void WndProc(ref Message m) { if (m.Msg == WM_DEVICECHANGE) { DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME)); if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME) ) { MessageBox.Show(DriveMaskToLetter(vol.dbcv_unitmask).ToString()); } if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME)) { MessageBox.Show("usb out"); } } base.WndProc(ref m); } [StructLayout(LayoutKind.Sequential)] //Same layout in mem public struct DEV_BROADCAST_VOLUME { public int dbcv_size; public int dbcv_devicetype; public int dbcv_reserved; public int dbcv_unitmask; } private static char DriveMaskToLetter(int mask) { char letter; string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //1 = A, 2 = B, 3 = C int cnt = 0; int pom = mask / 2; while (pom != 0) // while there is any bit set in the mask shift it right { pom = pom / 2; cnt++; } if (cnt < drives.Length) letter = drives[cnt]; else letter = '?'; return letter; } 

不要忘记添加这个:

 using System.Runtime.InteropServices; 

和以下常量:

  const int WM_DEVICECHANGE = 0x0219; //see msdn site const int DBT_DEVICEARRIVAL = 0x8000; const int DBT_DEVICEREMOVALCOMPLETE = 0x8004; const int DBT_DEVTYPVOLUME = 0x00000002; 

微软API代码包。 ShellObjectWatcher类。