web-dev-qa-db-fra.com

Comment détecter un lecteur USB a été branché?

Je veux construire un programme qui détecte si un usb (ou deux ou plus) est branché (et copie tout le contenu dans n'importe quel dossier sur un disque dur)

Des idées? J'ai ceci,

using System.Runtime.InteropServices;

Mais ce n'est pas la voie facile (que je crois). Je veux quelque chose de facile.

J'ai une autre idée (si (dossier existe) puis copier) quelque chose - mais il peut y avoir un problème avec cela, et je veux une bonne solution.

Il peut également y avoir un outil appelé SerialPort; puis-je l'utiliser? Si oui, comment puis-je l'utiliser?

53
angel

Il est facile de vérifier les périphériques amovibles. Cependant, rien ne garantit qu'il s'agisse d'un périphérique USB:

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

Cela renverra une liste de tous les périphériques amovibles actuellement accessibles. Plus d'information:

61
Elian Ebbing

Détecter si un lecteur USB est inséré n’est pas simple. Cependant, c'est tout à fait possible et le travail a été fait pour vous. Voici deux liens qui détaillent chacun une réponse sur la façon de procéder en C #:

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

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

L'une ou l'autre solution devrait bien fonctionner pour vous. Vous pouvez les adapter à vos besoins.

Edit: Voici une troisième solution au cas où vous voudriez plus d’options (fondamentalement, elles sont toutes identiques, mais le choix est bon, non?):

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

21
IAmTimCorey

Voici un code qui fonctionne pour moi et qui fait partie du site Web ci-dessus, associé à mes premiers essais: http://www.codeproject.com/KB/system/DriveDetector.aspx

Cela rend essentiellement votre formulaire à l’écoute des messages Windows, des filtres pour les lecteurs USB et (cd-dvds), récupère la structure lparam du message et extrait la lettre de lecteur.

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

N'oubliez pas d'ajouter ceci:

using System.Runtime.InteropServices;

et les constantes suivantes:

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

Microsoft API Code Pack. Classe ShellObjectWatcher.

2
Mark