2013-04-30 22 views
7

Ho notato che alcuni dispositivi di archiviazione USB non si registrano in Windows come unità normali, in quanto non ricevono nemmeno una lettera di unità. Pertanto, apparentemente non posso accedervi utilizzando l'API C standard per le operazioni sui file.WinAPI chiama per accedere all'archivio USB che non ha una lettera di unità?

Quali sono le WinAPI chiama posso usare per fare alcune operazioni sui file normali su quegli strani dispositivi - così:

  • find/enumerare quei dispositivi a tutti,
  • sfogliare l'albero del file/directory sul dispositivo e ottenere alcune statistiche di file (dimensioni, data di modifica, ecc.),
  • leggere/scrivere il contenuto dei file,
  • creare/eliminare file/directory?

Inoltre, quali sono le parole chiave generiche con cui tali tipi di dispositivi/protocollo sono conosciuti/chiamati?

+0

Suppongo che si tratti di una sorta di lettore multimediale? A volte questi dispositivi presentano la loro archiviazione tramite un'estensione dello spazio dei nomi della shell. È possibile utilizzare IShellFolder e gli amici per accedervi. – Luke

risposta

0

Se si sta parlando di un dispositivo di archiviazione di massa USB senza alcuna lettera di unità assegnata, si tratta solo di un volume senza un punto di montaggio. Avrai bisogno di montare il volume prima di leggerlo/scriverlo.

È possibile utilizzare il Volume Management Functions:

Ecco uno scritto in fretta esempio in C che elenca tutti i volumi esistenti, montare quelli montati e mostra alcune informazioni su ogni volume:

char volumeID[256], volumePathName[256], volumeName[256], volumeFS[256]; 
char newMountPoint[4] = " :\\"; 
unsigned long volumeSerialNumber; 
unsigned long size; 
HANDLE handle = FindFirstVolume(volumeID, 256); 
do { 
    printf("Volume GUID = %s\n", volumeID); 
    GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size); 
    if(strlen(volumePathName) == 0) { 
     printf("Not mounted\n"); 
     newMountPoint[0] = firstFreeLetter(); 
     if(SetVolumeMountPoint(newMountPoint, volumeID)) { 
      GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size); 
      printf("Now mounted on %s\n", volumePathName); 
     } 
    } 
    else { 
     printf("Mounted on %s\n", volumePathName); 
    } 
    GetVolumeInformation(volumePathName, volumeName, 256, &volumeSerialNumber, 
         NULL, NULL, volumeFS, 256); 
    printf("Volume name = %s, FS = %s, serial = %lu\n\n", 
      volumeName, volumeFS, volumeSerialNumber); 

}while(FindNextVolume(handle, volumeID, 256)); 

FindVolumeClose(handle); 

I deliberetely semplificare questo esempio, tuttavia il volume può avere più punti di montaggio (volumePathName è in realtà un multi -stringa). Si utilizza questa funzione per ottenere la prima lettera disponibile (dopo 'C') per montare un drive:

char firstFreeLetter() { 
    unsigned long freeLetters = GetLogicalDrives(); 
    if(freeLetters < 4) return 0; 
    char letter = 'C'; 
    for(unsigned long i=4; (freeLetters & i) != 0; ++letter, i <<= 1); 
    return letter; 
} 
+0

Penso che il mio caso potrebbe essere piuttosto un po '[MTP] (http://en.wikipedia.org/wiki/Media_Transfer_Protocol) o qualcosa del genere, ma non conosco questa zona troppo bene, quindi preferirei se qualcuno più ben informato mi risponderebbe se questa è l'unica possibilità. E come usare l'API, comunque. Non sono convinto che questo dispositivo sia assolutamente montabile. – akavel

+0

@akavel Sì, scusami quando ho letto 'Memoria USB', ho capito' USB flash drive' e non pensavo ai dispositivi multimediali. Vedi la mia altra risposta, probabilmente la cancellerò. – zakinster

4

Se stai parlando dispositivi mobili che appare come volumi montati, ma senza punti montati, bene sono chiamato Windows Portable Devices e non sono volumi montati.

Windows non accedere al file system direttamente, si comunica solo con loro attraverso il Media Transfer Protocol (MTP) o Immagine Transfert Protocol (PTP) e crea un shell namespace extension di presentare una cartella virtuale per l'utente .

Se si desidera comunicare con questo tipo di dispositivi, è molto probabile che si desideri utilizzare lo WPD API.

+0

Il collegamento all'API WPD sembra ora come qualcosa che potrebbe essere utile, grazie! Hai mai usato questa API, per caso? – akavel

+0

@akavel Penso di avere un codice che giace da qualche parte, cercherò di farne un breve esempio se possibile. – zakinster

0

Sì.Ci sono pochi casi in cui un'unità USB non ha una lettera di unità.

  1. Dispositivo Bluetooth, la fotocamera USB non ha la lettera di unità. ma questo non è il tuo caso, dal momento che hai menzionato il dispositivo di archiviazione.
  2. Un dispositivo di archiviazione USB registrato nel PC non come dispositivo di archiviazione. per esempio. Il lettore MP3 USB (dispositivo MTP) verrà rilevato come Lettore musicale e non ha una lettera di unità.

Credo che il vostro caso sia il caso n.

Per accedere ai file in un dispositivo di archiviazione, è necessario forzare il montaggio come dispositivo di archiviazione con lettera di unità. A meno che tu non abbia un punto di mount, non puoi accedere ai file in cui credo. Questo dipende dai dispositivi. Alcuni dispositivi (MTP) dispongono di impostazioni interne per decidere se rilevare come memoria o meno. È possibile esplorare le impostazioni nel dispositivo MTP.

Altrimenti è necessario forzare l'installazione di tutto il dispositivo di archiviazione tramite codice.

+0

** Non è possibile installare un dispositivo multimediale ** e non è necessario per trasferire i file. Questo è il punto principale di * MTP/PTP *, non è necessario montare o smontare (espellere) il dispositivo, non è necessario alcun driver di periferica, basta comunicare con esso tramite * transfert procotol *. Se si modifica la configurazione del dispositivo in modo che appaia come * USB Mass Storage *, non è più un dispositivo * PTP/MTP * (e non è sempre possibile farlo). – zakinster

+0

Si noti inoltre che il primo e il secondo caso sono uguali, una * USB camera * è in genere un * dispositivo PTP * mentre un * lettore MP3 * o un * telefono Android * sono in genere * dispositivi MTP *, ma ** sono entrambi dispositivi di archiviazione e utilizzano lo stesso protocollo **. – zakinster

+1

La disinformazione della risposta così com'è, era ancora valida e sono grato per questo, poiché ha introdotto la parola chiave MTP nella discussione ... – akavel