Question

J'essaie d'écrire un petit programme de sauvegarde pour les amis et la famille et je souhaite qu'il soit aussi simple que possible. Je ne veux pas avoir à demander à l'utilisateur où sauvegarder leurs données, je veux juste rechercher et utiliser le premier disque dur USB connecté à l'ordinateur. L'obtention de l'identifiant unique du disque dur serait probablement une bonne idée aussi, tout comme une double vérification de la prochaine exécution de la sauvegarde.

Était-ce utile?

La solution 2

J'ai passé un peu de temps à regarder autour de moi et j'ai trouvé une fonction appelée SetupDiEnumDeviceInfo qui fournissait une solution pour savoir si un disque dur était amovible ou non, mais avec cette information, je ne peux toujours pas (encore) cartographier ce que je trouve lettre de lecteur!

Voici ce que j'ai jusqu'à présent (le code suivant crée une dll):

#include "stdafx.h"
#include <setupapi.h>
#include <devguid.h>
#include <cfgmgr32.h>
extern "C" __declspec(dllexport) int usb_hard_drives() {
  HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, DIGCF_PRESENT);
  if (hdevinfo == INVALID_HANDLE_VALUE) return -1;
  DWORD MemberIndex = 0;
  SP_DEVINFO_DATA sp_devinfo_data;
  ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
  sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);
  int c = 0;
  while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) {
    DWORD PropertyRegDataType;
    DWORD RequiredSize;
    DWORD PropertyBuffer;
    if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_CAPABILITIES, &PropertyRegDataType, (PBYTE)&PropertyBuffer, sizeof(PropertyBuffer), &RequiredSize)) {
      if (PropertyBuffer && CM_DEVCAP_REMOVABLE == CM_DEVCAP_REMOVABLE) {
        // do something here to identify the drive letter.
        c++;
      }
    }       
    MemberIndex++;
  }
  SetupDiDestroyDeviceInfoList(hdevinfo);
  return c;
}

Autres conseils

Je sais que votre question est étiquetée Win32, mais c'est assez simple avec .NET:

foreach (IO.DriveInfo drive in IO.DriveInfo.GetDrives()) {
  if ((drive.DriveType == IO.DriveType.Removable)) {
    // this is a removable drive
  }
}

Voir drive.Name et drive.VolumeLabel pour obtenir l’étiquette. Vous pouvez également obtenir la taille et supposer en toute connaissance de cause qu'il s'agit d'une clé USB (suffisamment grande). - Amovible peut signifier soit une disquette, soit une clé USB. en fonction de la documentation .

En guise de remarque, du point de vue de l'interface utilisateur, je vous suggérerais la première fois que vous trouverez un nouveau disque, de le présenter à l'utilisateur et de lui demander: "Est-ce le lecteur que vous souhaitez utiliser pour les sauvegardes?". Sinon, il y a un grand risque d'effacer accidentellement les données d'une clé USB qui s'est avérée être branchée. Rien ne détruit la crédibilité d'un programme de sauvegarde, comme lorsqu'il détruit vos données. :)

Vous devez utiliser la fonction RegisterDeviceNotification . Voici quelques indications sur la manière de pour le faire. Et un autre exemple de code

.

Vous pouvez énumérer tous les périphériques de stockage de masse à l'aide de cet exemple. En général, recherchez les api SetupDiXXX.

Veuillez noter que, compte tenu de la nature dynamique des périphériques USB, l’utilisation du mécanisme de notification est obligatoire à mon humble avis. Vous pourriez trouver votre périphérique d’analyse automatique déjà détaché ou le nouveau périphérique manquant qui vient d’arriver.

Quelques informations peuvent être rassemblées sans trop de problèmes:

  • Utilisez GetDriveType pour rechercher le premier lecteur amovible, vérifiez si un support inscriptible existe (ce qui éliminera en grande partie les lecteurs de CD). Vous pouvez également consulter d'autres chaînes disponibles lorsque vous interrogez les informations sur le lecteur via win32.
  • Utilisez libusb pour voir où se trouve le premier périphérique USB de stockage (ce sera probablement un disque flash ou un disque dur)
  • Cet article C # pointe vers les classes de lecteur de disque Win32 auxquelles vous pourriez accéder.

Postez votre réponse ici quand vous la trouverez!

-Adam

J'ai trouvé une fonction intéressante dans l'API Win32 pour tester le type de lecteur.

if( 2 == ::getDriveType( <driveletter> )){
  // its removable 
}

Valeurs de retour de la fonction:

DRIVE_UNKNOWN 0: Le type de lecteur ne peut pas être déterminé.

DRIVE_NO_ROOT_DIR 1: le chemin racine est invalide; Par exemple, aucun volume n'est monté sur le chemin spécifié.

DRIVE_REMOVABLE 2: le lecteur dispose d'un support amovible; par exemple, un lecteur de disquette, une clé USB ou un lecteur de carte flash.

DRIVE_FIXED 3: le lecteur a un support fixe; par exemple, un lecteur de disque dur ou un lecteur flash.

DRIVE_REMOTE 4: le lecteur est un lecteur distant (réseau).

DRIVE_CDROM 5: le lecteur est un lecteur de CD-ROM.

DRIVE_RAMDISK 6: le lecteur est un disque RAM.

http: // msdn .microsoft.com / fr-fr / bibliothèque / windows / desktop / aa364939 (v = vs.85) .aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top