Frage

Ich versuche, ein wenig Backup-Programm für Freunde und Familie zu schreiben und will es so einfach sein, um ein möglich zu nutzen. Ich will nicht den Benutzer fragen haben, wo ihre Daten sichern zu, ich möchte nur suchen und die erste USB-Festplatte an den Computer angeschlossen verwenden. die eindeutige ID der Festplatte zu erhalten wahrscheinlich eine gute Idee sein würde, nur als Doppelprüfung für die nächste Mal, wenn die Sicherung ausgeführt wird.

War es hilfreich?

Lösung 2

Ich verbrachte ein wenig Zeit, schaut sich um und eine Funktion gefunden SetupDiEnumDeviceInfo genannt, die eine Lösung zu bieten hat zu wissen, ob eine Festplatte war abnehmbar oder nicht, aber mit diesen Informationen kann ich immer noch nicht (noch) Karte, was ich zurück zu einem finden Laufwerksbuchstaben!

Hier ist, was ich bisher (folgende Code erstellt eine 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;
}

Andere Tipps

Ich kenne deine Frage Win32 ist markiert, aber das ist ganz einfach mit .NET:

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

Siehe drive.Name und drive.VolumeLabel für das Label zu bekommen. Sie können auch die Größe erhalten, und eine begründete Vermutung, dass es ist ein USB-Stick (und groß genug, um eine) - Abnehmbarer bedeuten kann entweder Floppy oder USB, nach dem docs .

Als Randbemerkung, von einer UI-Perspektive, würde ich das erste Mal, wenn Sie ein neues Laufwerk finden vorschlagen, präsentieren sie den Benutzer und fragen: „Ist dies das Laufwerk, das Sie für Backups verwenden?“. Ansonsten gibt es ein großes Potenzial für die versehentlich Daten auf einem USB-Stick auszulöschen, die in steckbar passiert. Nichts zerstört die Glaubwürdigkeit eines Backup-Programm, wie wenn sie Ihre Daten zerstört. :)

Sie müssen verwenden RegisterDeviceNotification Funktion. Hier ist einige Hinweise darüber, wie es zu tun. Und noch ein Beispielcode

Sie können alle Massenspeichergeräte mit diese Probe. Im Allgemeinen sucht SetupDiXXX api.

Bitte beachten Sie, dass unter Berücksichtigung dynamischer Art von USB-Geräten nehmen, Benachrichtigungsmechanismus mit verbindlicher IMHO ist. Sie können Ihr Selbstanalysegerät, das bereits abgelöst oder fehlende neues Gerät, das gerade angekommen finden.

Ein paar Stücke von Informationen kann ohne allzu viel Mühe gesammelt werden:

  • Verwenden Sie GetDriveType die erste Wechsellaufwerk, Test zu finden, wenn beschreibbaren Medien existiert (die weitgehend CD-Laufwerke ausschließen wird). Kann auch bei weiteren Strings suchen möchten, die verfügbar sind, wenn Sie die Laufwerksinformationen über win32 abfragen.
  • Verwenden Sie Libusb zu sehen, wo das erste Speicherklasse USB-Gerät ist (wahrscheinlich mit einer Handy- oder Festplatte sein)
  • Die C # Artikel Punkte auf win32 Plattenlaufwerk Klassen, die Sie anzapfen könnten fähig sein.

Senden Sie Ihre Antwort hier, wenn Sie es finden!

-Adam

fand ich eine große Funktion in dem Win32-API für die Art des Antriebs zu testen.

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

Rückgabewerte der Funktion:

DRIVE_UNKNOWN 0: Der Typ-Laufwerk kann nicht bestimmt werden.

DRIVE_NO_ROOT_DIR 1: Der Wurzelpfad ungültig ist; zum Beispiel gibt es kein Volumen in dem angegebenen Pfad montiert ist.

DRIVE_REMOVABLE 2: Das Laufwerk verfügt über entfernbare Medien; beispielsweise ein Diskettenlaufwerk, USB-Stick oder Flash-Kartenleser.

DRIVE_FIXED 3: Der Antrieb ist Medien befestigt ist; beispielsweise Laufwerk oder Flash-Laufwerk eine Festplatte.

DRIVE_REMOTE 4: Der Antrieb ist ein Fern (Netzwerk) Laufwerk.

DRIVE_CDROM 5: Das Laufwerk ist ein CD-ROM-Laufwerk

.

DRIVE_RAMDISK 6: Der Antrieb ist ein RAM-Disk

.

http: // msdn .microsoft.com / en-us / library / windows / Desktop / aa364939 (v = VS.85) aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top