2011-05-14 74 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

相關問題