2011-05-14 51 views
47

我想建立一个检测是否有USB(或两个以上) 被堵塞的程序(和所有内容复制到任意文件夹在硬盘上)如何检测USB驱动器已插入?

任何想法?我有这个,

using System.Runtime.InteropServices; 

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

我还有一个想法(如果(文件夹中),然后复制)的东西 - 但也有可能是一个问题了,并且我希望有一个很好的解决方案。

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

+2

把它分解成各个片。检测USB驱动器的代码是一个代码,复制数据的代码是另一个代码。做你现在可以做的棋子。 – 2011-05-14 18:08:34

+0

是啊!我现在可以“复制”文件..用批处理文件程序可以“创建”它的文件,如果不存在 – angel 2011-05-14 18:10:09

+0

相关:http://stackoverflow.com/questions/620144/detecting-usb-drive-insertion-and-removal -using-windows-service-and-c-sharp – DuckMaestro 2016-07-01 18:33:34

回答

53

这是很容易检查可拆卸设备,但它不保证它是USB设备:

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

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

+0

你在哪里声明“drive”? – angel 2011-05-14 18:21:47

+3

@angel:你不必单独声明'drive':'drive'是我用作'.Where()'扩展方法的输入的lamba表达式的输入参数。它是Linq功能的一部分,被.NET Framework 3.5所影响。有关Linq的更多信息:http://msdn.microsoft.com/en-us/vbasic/aa904594。 – 2011-05-14 18:25:36

+0

这不会给你CD-ROM驱动器,存储卡驱动器,有时甚至是硬盘驱动器(在我的电脑中,即使它是C驱动器,我的SATA驱动器也显示为可移动)?此外,您是否需要持续循环检测以检测驱动器何时插入或是否存在某种触发器? – IAmTimCorey 2011-05-14 22:26:21

18

检测USB驱动器是否插入并不简单。但是,这绝对是可能的,并且已经为您完成了工作。下面是每个细节上如何做到这一点在C#中回答两个环节:

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

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

两种解决方案应该可以正常工作适合你。您可以调整它们以适应您的需求。

编辑:这是在情况下,第三个方案你想要更多的选择(他们基本上都是相同的,但是选择还是不错的,对不对?):

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

2

微软API代码包。 ShellObjectWatcher类。

11

这里是为我工作的代码,这是从网站上面有我的早期试验相结合的部分: http://www.codeproject.com/KB/system/DriveDetector.aspx

这基本上使您的形式听取窗口消息,过滤器的USB驱动器和(CD -dvds),抓取消息的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; 
+1

一注 - 在if(m.Msg == WM_DEVICECHANGE)周围使用try-catch。 – Onsightfree 2012-11-10 18:47:43

相关问题