Exploration d’un appareil
L’exploration d’un appareil est similaire à l’exploration d’un lecteur de disque. Tous les objets d’un appareil sont appelés stockages. Un stockage peut être un fichier, un dossier ou un objet abstrait (par exemple, une playlist) sur l’appareil. Vous devez examiner les attributs et les métadonnées d’un stockage (si pris en charge) pour comprendre de quel type de stockage il s’agit. Les stockages sont organisés hiérarchiquement sur l’appareil ; chaque stockage a exactement un parent, et tous les stockages descendent finalement d’un seul stockage d’appareil racine, généralement nommé « \ ».
Les étapes suivantes décrivent comment explorer un appareil :
- Obtenez l’interface IWMDMDevice d’un appareil, comme décrit dans Énumération des appareils.
- Appelez IWMDMDevice::EnumStorage pour récupérer une interface IWMDMEnumStorage . Cette interface est utilisée pour obtenir tous les objets enfants du stockage qui retourne cette interface. Lors de l’obtention de cette interface à partir de l’appareil, comme nous sommes ici, elle ne contient qu’un seul stockage : le stockage d’appareil racine.
- Appelez IWMDMEnumStorage::Next avec un nombre de 1 pour récupérer l’interface IWMDMStorage pour le stockage d’appareil racine. (Vous ne pouvez pas demander plusieurs enfants à partir de l’appareil.)
- Examinez tous les stockages sur l’appareil en appelant de manière récursive IWMDMStorage::EnumStorage , puis IWMDMEnumStorage::Suivant pour obtenir des enfants d’un stockage. Pour voir si un stockage a des enfants afin d’éviter les appels à EnumStorage et Suivant, vous pouvez appeler IWMDMStorage::GetAttributes pour case activée pour les indicateurs WMDM_STORAGE_ATTR_HAS_FILES ou WMDM_STORAGE_ATTR_HAS_FOLDERS. Pour plus d’informations sur la façon d’obtenir les propriétés d’un stockage, consultez Obtention et définition des métadonnées et des attributs et Obtention et définition des métadonnées et des attributs dans l’application.
Windows Media Gestionnaire de périphériques n’expose pas un ensemble standard de dossiers pour contenir des médias d’un type spécifique (par exemple, un dossier « Mes playlists » pour les playlists). Chaque appareil dispose d’un système de fichiers unique et vous devrez choisir un emplacement approprié pour rechercher ou envoyer un fichier spécifique.
Notes
Windows Explorer peut afficher des dossiers virtuels qui n’existent pas réellement sur l’appareil. Les dossiers « Média » et « Données » affichés pour les appareils MTP sont des exemples de dossiers virtuels. Ces dossiers sont créés par Windows pour simplifier les téléchargements pour les utilisateurs finaux ; ils n’existent pas réellement sur l’appareil. Votre application ne doit pas dépendre de la recherche de ces types de dossiers généraux. À l’inverse, windows Explorer peut ne pas afficher certains dossiers ou objets qui existent sur l’appareil (par exemple, les playlists).
L’exemple de code C++ suivant illustre l’exploration récursive d’un appareil. Il utilise deux fonctions :
- ExploreDevice, une fonction de démarrage qui reçoit un pointeur d’appareil et obtient un pointeur vers l’énumérateur racine de cet appareil.
- RecursiveExploreStorage, appelé pour explorer un appareil de manière récursive.
// 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;
}
Rubriques connexes