¿Cómo detectar una unidad USB ha sido enchufado?

Quiero crear un progtwig que detecte si un usb (o dos o más) está conectado (y copie todo el contenido a cualquier carpeta en un disco duro)

¿Algunas ideas? Tengo esto,

using System.Runtime.InteropServices; 

Pero no es la manera fácil (que yo creo). Quiero algo fácil.

Tengo otra idea (si (existe una carpeta) y luego copia) algo, pero puede haber un problema con eso, y quiero una buena solución.

También puede haber una herramienta llamada SerialPort; ¿Puedo usarlo? Si es así, ¿cómo lo uso?

Es fácil verificar si hay dispositivos extraíbles. Sin embargo, no hay garantía de que sea un dispositivo USB:

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

Esto devolverá una lista de todos los dispositivos extraíbles que están actualmente accesibles. Más información:

  • La clase DriveInfo (documentación msdn)
  • La enumeración DriveType (documentación msdn)

Detectar si una unidad USB está insertada no es simple. Sin embargo, definitivamente es posible y el trabajo ha sido hecho para usted. Aquí hay dos enlaces que detallan una respuesta sobre cómo hacer esto en C #:

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

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

Cualquiera de las soluciones debería funcionar bien para ti. Puede adaptarlos para satisfacer sus necesidades.

Editar: Aquí hay una tercera solución en caso de que desee más opciones (básicamente todas son iguales, pero la opción es buena, ¿no?):

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

Aquí hay un código que funciona para mí, que es una parte del sitio web anterior combinado con mis primeros ensayos: http://www.codeproject.com/KB/system/DriveDetector.aspx

Esto básicamente hace que su forma escuche los mensajes de Windows, filtros para unidades usb y (cd-dvds), capta la estructura lparam del mensaje y extrae la letra de la unidad.

 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; } 

No olvides agregar esto:

 using System.Runtime.InteropServices; 

y las siguientes constantes:

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

Paquete de código API de Microsoft. Clase ShellObjectWatcher.