Domanda

Sto cercando di scrivere un piccolo programma di backup per amici e parenti e voglio che sia il più semplice possibile. Non voglio chiedere all'utente dove eseguire il backup dei propri dati, voglio solo cercare e utilizzare il primo disco rigido USB collegato al computer. Anche ottenere l'ID univoco del disco rigido sarebbe probabilmente una buona idea, proprio come un doppio controllo per la prossima esecuzione del backup.

È stato utile?

Soluzione 2

Ho passato un po 'di tempo a guardarmi intorno e ho trovato una funzione chiamata SetupDiEnumDeviceInfo che mi ha fornito una soluzione per sapere se un disco rigido era rimovibile o meno, ma con quelle informazioni non riesco ancora (ancora) a mappare ciò che trovo lettera di unità!

Ecco quello che ho finora (il seguente codice crea una 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;
}

Altri suggerimenti

So che la tua domanda è taggata Win32, ma questo è abbastanza semplice con .NET:

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

Vedi drive.Name e drive.VolumeLabel per ottenere l'etichetta. Puoi anche ottenere le dimensioni e indovinare che si tratta di una chiavetta USB (e abbastanza grande) - Rimovibile può significare Floppy o USB, secondo i documenti .

Come nota a margine, dal punto di vista dell'interfaccia utente, suggerirei la prima volta che trovi una nuova unità, presentala all'utente e chiedi " è questa l'unità che vuoi usare per i backup? " ;. Altrimenti, c'è un grande potenziale per cancellare accidentalmente i dati su una chiave USB che è stata inserita. Nulla distrugge la credibilità di un programma di backup come quando distrugge i tuoi dati. :)

Devi utilizzare la funzione RegisterDeviceNotification . Qui sono alcuni suggerimenti su come per farlo. E ancora un codice di esempio

Puoi enumerare tutti i dispositivi di archiviazione di massa utilizzando questo esempio. In generale cerca SetupDiXXX api.

Si noti che, tenendo conto della natura dinamica dei dispositivi USB, l'utilizzo del meccanismo di notifica è obbligatorio IMHO. Potresti trovare il tuo dispositivo di autoanalisi che ha già staccato o manca un nuovo dispositivo appena arrivato.

Alcune informazioni possono essere raccolte senza troppi problemi:

  • Usa GetDriveType per trovare la prima unità rimovibile, verifica se esiste un supporto scrivibile (che escluderà in gran parte le unità CD). Potrebbe anche voler esaminare ulteriori stringhe disponibili quando si interrogano le informazioni sull'unità tramite win32.
  • Usa libusb per vedere dove si trova il primo dispositivo USB della classe di archiviazione (probabilmente sarà un flash o un disco rigido)
  • Questo articolo C # indica le classi di unità disco win32 nelle quali potresti essere in grado di attingere.

Pubblica la tua risposta qui quando la trovi!

-Adam

Ho trovato un'ottima funzione nell'API Win32 per testare il tipo di unità.

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

Restituisce i valori della funzione:

DRIVE_UNKNOWN 0: il tipo di unità non può essere determinato.

DRIVE_NO_ROOT_DIR 1: il percorso radice non è valido; ad esempio, non esiste alcun volume montato nel percorso specificato.

DRIVE_REMOVABLE 2: l'unità ha supporti rimovibili; ad esempio un'unità floppy, una chiavetta USB o un lettore di schede flash.

DRIVE_FIXED 3: l'unità ha supporti fissi; ad esempio, un disco rigido o un'unità flash.

DRIVE_REMOTE 4: l'unità è un'unità remota (di rete).

DRIVE_CDROM 5: l'unità è un'unità CD-ROM.

DRIVE_RAMDISK 6: l'unità è un disco RAM.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top