如何检测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 : //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类。