Exploración de un dispositivo
Explorar un dispositivo es similar a explorar una unidad de disco. Todos los objetos de un dispositivo se denominan almacenamientos. Un almacenamiento puede ser un archivo, una carpeta o un objeto abstracto (como una lista de reproducción) en el dispositivo. Debe examinar los atributos y metadatos de un almacenamiento (si se admite) para comprender qué tipo de almacenamiento es. Los almacenamientos se organizan jerárquicamente en el dispositivo; cada almacenamiento tiene exactamente un elemento primario y, en última instancia, todos los almacenamientos descienden de un único almacenamiento de dispositivo raíz, normalmente denominado "\".
En los pasos siguientes se describe cómo explorar un dispositivo:
- Obtenga la interfaz IWMDMDevice de un dispositivo como se describe en Enumerar dispositivos.
- Llame a IWMDMDevice::EnumStorage para recuperar una interfaz IWMDMEnumStorage . Esta interfaz se usa para obtener todos los objetos secundarios del almacenamiento que devuelve esta interfaz. Al obtener esta interfaz del dispositivo, como estamos aquí, solo contendrá un almacenamiento: el almacenamiento del dispositivo raíz.
- Llame a IWMDMEnumStorage::Next con un recuento de 1 para recuperar la interfaz IWMDMStorage para el almacenamiento del dispositivo raíz. (No se puede solicitar más de un elemento secundario desde el dispositivo).
- Examine todos los almacenamientos del dispositivo mediante una llamada recursiva a IWMDMStorage::EnumStorage y, a continuación, IWMDMEnumStorage::Next para obtener elementos secundarios de un almacenamiento. Para ver si un almacenamiento tiene elementos secundarios para evitar las llamadas a EnumStorage y Next, puede llamar a IWMDMStorage::GetAttributes para comprobar las marcas WMDM_STORAGE_ATTR_HAS_FILES o WMDM_STORAGE_ATTR_HAS_FOLDERS. Para obtener más información sobre cómo obtener las propiedades de un almacenamiento, vea Obtener y establecer metadatos y atributos y obtener y establecer metadatos y atributos en la aplicación.
Windows Media Administrador de dispositivos no expone un conjunto estándar de carpetas para contener medios de un tipo específico (por ejemplo, una carpeta "Mis listas de reproducción" para listas de reproducción). Cada dispositivo tiene un sistema de archivos único y tendrás que decidir un lugar adecuado para buscar o enviar un archivo específico.
Nota
El Explorador de Windows puede mostrar carpetas virtuales que realmente no existen en el dispositivo. Las carpetas virtuales de ejemplo son las carpetas "Medios" y "Datos" que se muestran para los dispositivos MTP. Windows crea estas carpetas para que las descargas sean más sencillas para los usuarios finales; realmente no existen en el dispositivo. La aplicación no debe depender de encontrar estos tipos de carpetas generales. Por el contrario, es posible que el Explorador de Windows no muestre algunas carpetas u objetos que existen en el dispositivo (por ejemplo, listas de reproducción).
El siguiente código de ejemplo de C++ muestra la exploración recursiva de un dispositivo. Usa dos funciones:
- ExploreDevice, una función de inicio que recibe un puntero de dispositivo y obtiene un puntero al enumerador raíz de ese dispositivo.
- RecursiveExploreStorage, al que se llama para explorar un dispositivo de forma recursiva.
// 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;
}
Temas relacionados