Esplorazione di un dispositivo
L'esplorazione di un dispositivo è simile all'esplorazione di un'unità disco. Tutti gli oggetti in un dispositivo sono denominati archivi. Una risorsa di archiviazione può essere un file, una cartella o un oggetto astratto (ad esempio una playlist) nel dispositivo. È necessario esaminare gli attributi e i metadati di una risorsa di archiviazione (se supportati) per comprendere il tipo di archiviazione. Le risorse di archiviazione sono organizzate gerarchicamente nel dispositivo; ogni risorsa di archiviazione ha esattamente un elemento padre e tutte le risorse di archiviazione in definitiva derivano da una singola risorsa di archiviazione del dispositivo radice, denominata in genere "\".
I passaggi seguenti descrivono come esplorare un dispositivo:
- Ottenere l'interfaccia IWMDMDevice di un dispositivo come descritto in Enumerazione dei dispositivi.
- Chiamare IWMDMDevice::EnumStorage per recuperare un'interfaccia IWMDMEnumStorage . Questa interfaccia viene usata per ottenere tutti gli oggetti figlio della risorsa di archiviazione che restituisce questa interfaccia. Quando si ottiene questa interfaccia dal dispositivo, come ci troviamo qui, conterrà una sola risorsa di archiviazione: l'archiviazione del dispositivo radice.
- Chiamare IWMDMEnumStorage::Next con un conteggio di 1 per recuperare l'interfaccia IWMDMStorage per l'archiviazione del dispositivo radice. Non è possibile richiedere più di un elemento figlio dal dispositivo.
- Esaminare tutte le risorse di archiviazione nel dispositivo chiamando in modo ricorsivo IWMDMStorage::EnumStorage e quindi IWMDMEnumStorage::Next per ottenere elementi figlio di una risorsa di archiviazione. Per verificare se una risorsa di archiviazione include elementi figlio per evitare le chiamate a EnumStorage e Avanti, è possibile chiamare IWMDMStorage::GetAttributes per verificare la presenza di flag WMDM_STORAGE_ATTR_HAS_FILES o WMDM_STORAGE_ATTR_HAS_FOLDERS. Per altre informazioni su come ottenere le proprietà di un archivio, vedere Recupero e impostazione di metadati e attributi e recupero e impostazione di metadati e attributi nell'applicazione.
Windows Media Gestione dispositivi non espone un set standard di cartelle per contenere supporti di un tipo specifico (ad esempio, una cartella "Playlist personali" per le playlist). Ogni dispositivo ha un file system univoco e dovrai decidere una posizione appropriata per cercare o inviare un file specifico.
Nota
Esplora risorse può mostrare cartelle virtuali che non esistono effettivamente nel dispositivo. Le cartelle virtuali di esempio sono le cartelle "Media" e "Data" visualizzate per i dispositivi MTP. Queste cartelle vengono create da Windows per semplificare i download per gli utenti finali; non esistono effettivamente nel dispositivo. L'applicazione non deve dipendere dalla ricerca di questi tipi di cartelle generali. Al contrario, Esplora risorse potrebbe non visualizzare alcune cartelle o oggetti esistenti nel dispositivo ,ad esempio playlist.
Il codice di esempio C++ seguente illustra l'esplorazione ricorsiva di un dispositivo. Usa due funzioni:
- ExploreDevice, una funzione iniziale che riceve un puntatore al dispositivo e ottiene un puntatore all'enumeratore radice per tale dispositivo.
- RecursiveExploreStorage, chiamato per esplorare un dispositivo in modo ricorsivo.
// Get the root enumerator and start the recursive function.
HRESULT ExploreDevice(IWMDMDevice* pDevice)
{
HRESULT hr = S_OK;
// Get a root enumerator.
CComPtr<IWMDMEnumStorage> pEnumStorage;
hr = pDevice->EnumStorage(&pEnumStorage);
if (SUCCEEDED(hr))
{
RecursiveExploreStorage(pEnumStorage);
}
return hr;
}
// Recursively explore a storage.
void RecursiveExploreStorage(IWMDMEnumStorage* pEnumStorage)
{
HRESULT hr = S_OK;
CComPtr<IWMDMStorage> pStorage;
ULONG numRetrieved = 0;
// Loop through all storages in the current storage.
while((pEnumStorage->Next(1, &pStorage, &numRetrieved) == S_OK) && (numRetrieved == 1))
{
// Get the name of the object.
const UINT MAX_LEN = 255;
WCHAR name[MAX_LEN];
hr = pStorage->GetName((LPWSTR)&name, MAX_LEN);
// TODO: Display the retrieved storage name
// If this is a folder, recurse into it.
if (attributes & WMDM_FILE_ATTR_FOLDER)
{
CComPtr<IWMDMEnumStorage> pEnumSubStorage;
hr = pStorage->EnumStorage(&pEnumSubStorage);
if (SUCCEEDED(hr)
{
RecursiveExploreStorage(pEnumSubStorage);
}
}
pStorage.Release();
} // Get the next storage pointer.
return;
}
Argomenti correlati