66 votes

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

Je veux construire un programme qu'il détecte si un usb (ou deux ou plus) sont plug (et copiez tout ce qu'il a dans un dossier du disque dur)

Une idée? j'ai vu

 using System.Runtime.InteropServices;
 

mais ce n'est pas la manière facile (que je crois) je veux quelque chose de facile j'ai une autre idée (si (dossier existe) puis copier) quelque chose .. mais ça va être un problème, et je veux une bonne solution, merci!

il y a un outil appelé

SerialPort puis-je l'utiliser? et comment l'utiliser?

73voto

Elian Ebbing Points 8363

Il est facile de vérifier pour les périphériques amovibles, toutefois, il ne faut pas garantir que c'est un périphérique USB:

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

Cela renvoie une liste de tous les périphériques amovibles qui sont actuellement accessibles. Plus d'informations:

21voto

BiggsTRC Points 10362

Détecter si une clé USB est insérée n'est pas simple. Cependant, il est certainement possible et le travail a été fait pour vous. Voici deux liens que chaque détail d'une réponse sur la façon de le faire en C#:

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

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

Solution devrait fonctionner pour vous. Vous pouvez les adapter en fonction de vos besoins.

Edit: Voici une troisième solution dans le cas où vous voulais plus d'options (en gros, ils sont tous les mêmes, mais le choix est bon, non?):

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

15voto

Onsightfree Points 92

Voici un code qui fonctionne pour moi, qui est une partie du site web ci-dessus combinés avec mes premiers essais: http://www.codeproject.com/KB/system/DriveDetector.aspx

De ce fait, fondamentalement, votre formulaire d'écouter les messages de windows, les filtres pour les lecteurs usb et (cd-dvd), saisit le lparam structure du message et des extraits de 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;
    }

Ne pas oublier 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;  

3voto

Mark Points 56

Microsoft API Code Pack. Classe ShellObjectWatcher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X