2009-11-25 14 views
7

Su Windows (XP-7), esiste un modo affidabile di differenziare in modo programmatico tra unità floppy USB e unità flash USB in C++?Differenziazione programmatica tra USB Floppy Drive e USB Flash Drive in Windows

Al momento, sto utilizzando WMI per ottenere gli aggiornamenti quando vengono rilevate nuove istanze Win32_LogicalDisk e quindi utilizzando l'attributo DriveType dell'oggetto LogicalDisk per calcolare un tipo di base. Funziona abbastanza bene, tranne che le unità floppy e le unità flash USB sono entrambi DriveType DRIVE_REMOVABLE, quindi per distinguere tra quelli (floppy e flash), sto usando l'interfaccia IOCTL_STORAGE_GET_HOTPLUG_INFO per capire se il dispositivo è hot-plug e funzionava sul preside ciò significava che era un flash drive e non un dischetto. Ancora una volta, penso che funzioni abbastanza bene (anche se un po 'inefficiente, usando sia l'API WDK che WMI per ottenere informazioni) nel caso delle unità floppy interne, ma sfortunatamente le unità floppy USB sono anche hotplugable per un sacco di volte, quindi c'è nessun modo chiaro per distinguere tra flash e unità floppy USB, che posso vedere. So che ci sono proprietà che possono funzionare, come controllare se è mappato alle unità riservate A: o B (modifica: rilevante solo se la macchina ha sicuramente un lettore floppy - vedi MS-KB: How to change drive letter assignments in Windows XP), o guardando la descrizione, ma io Mi piace davvero qualcosa di un po 'più affidabile.

Ci scusiamo per la lunga spiegazione, ma volevo solo essere chiari! Grazie

+1

A: e B: sono _ervitati per i floppy_? Fonte? – MSalters

+1

L'ho ottenuto da [MS-KB: come cambiare l'assegnazione delle lettere di unità in Windows XP] (http://support.microsoft.com/kb/307844), e il modo in cui lo esprimono, ma come indica anche , se la macchina non dispone di un'unità floppy, possono essere utilizzate per altre unità, quindi è probabilmente un termine improprio e certamente non indicativo del fatto che l'unità sia un'unità floppy o meno. Riformulerò la domanda per renderla un po 'più chiara. – user82116

+0

Ah, questo è da un punto di vista dell'utente, quando stai cambiando manualmente i driveletters. Ha senso quindi, stavo pensando da un punto di vista del sistema operativo. – MSalters

risposta

5

Hai provato Win32_LogicalDisk.MediaType? Ha enumerazioni specifiche per floppy disk. Assicurati di provarlo quando non ci sono dischi nell'unità.

+0

Nel caso in cui qualcun altro abbia bisogno di questo, il mio test ha rilevato che restituisce correttamente un tipo di supporto approssimativo (sicuramente abbastanza buono per il floppy USB rispetto all'unità flash) quando non ci sono media presenti, ma questo non è garantito - dai [documenti] (http://msdn.microsoft.com/en-us/library/aa394173%28VS.85%29.aspx): "Win32_LogicalDisk.Media Type: tipo di supporto attualmente presente nell'unità logica. Questo valore sarà uno di i valori dell'enumerazione MEDIA_TYPE definiti in Winioctl.h. Il valore potrebbe non essere esatto per le unità rimovibili se al momento non è presente alcun supporto nell'unità. " – user82116

+0

Ovviamente, la situazione "nessun supporto nell'unità" implica che si tratta di un'unità di caricamento del supporto e quindi non di un'unità flash USB. – MSalters

+0

Vedere la mia risposta qui sotto. Inoltre, molti dischi flash USB inizieranno a dichiararsi come "supporti rimovibili" e iniziano con "nessun supporto nell'unità" (e segnaleranno il supporto inserito una volta pronti per accettare i comandi) – Boris

4

È possibile utilizzare l'attributo Dimensione (USB> 1,4 MB), non è come se ci fosse qualche possibilità di incontrare 1,4 MB di flash drive in qualsiasi momento presto.

+0

È meglio fare 2.88 MB, anche se credo che il formato floppy non fosse comune al di fuori del Giappone. – MSalters

+0

Non lo faccio se tutte le unità Zip (che supportano fino a 750 MB) non sono considerate come floppy. –

5

A livello USB, non c'è modo di distinguere tra un Disk on Key convenzionale e un floppy USB. Ciò significa che Windows stesso, non può dire in modo affidabile ciò che è.

Ci sono alcuni suggerimenti che è possibile raccogliere: I floppy dovrebbero: a. Protocollo di archiviazione di massa CBI/CB b. SCSI UFI

MA, nel mondo dei dispositivi USB, ognuno fa quello che vuole. L'unico test è: "Funziona su Windows". E Windows controlla solo le dimensioni, se si tratta di un dispositivo USB con set di supporti rimovibili e con dimensioni di floppy convenzionali, lo considererà un dischetto.

Non si può dire del "vero" floppy, ma con l'USB collegato, non esiste un modo definito.

3

La proprietà ovvia da verificare sarebbe IOCTL_DISK_GET_DRIVE_GEOMETRY. Questo ti dà (tra le altre cose) un MEDIA_TYPE. Tutto ciò che non è RemovableMedia e FixedMedia è un dischetto.