Explorando um dispositivo
Explorar um dispositivo é semelhante à exploração de uma unidade de disco. Todos os objetos em um dispositivo são chamados de armazenamentos. Um armazenamento pode ser um arquivo, pasta ou objeto abstrato (como uma playlist) no dispositivo. Você deve examinar os atributos e metadados de um armazenamento (se houver suporte) para entender que tipo de armazenamento ele é. Os armazenamentos são organizados hierarquicamente no dispositivo; cada armazenamento tem exatamente um pai, e todos os armazenamentos, em última análise, são descendentes de um único armazenamento de dispositivo raiz, normalmente chamado de "\".
As etapas a seguir descrevem como explorar um dispositivo:
- Obtenha a interface IWMDMDevice de um dispositivo, conforme descrito em Enumerando Dispositivos.
- Chame IWMDMDevice::EnumStorage para recuperar uma interface IWMDMEnumStorage . Essa interface é usada para obter todos os objetos filho do armazenamento que retorna essa interface. Ao obter essa interface do dispositivo, como estamos aqui, ela conterá apenas um armazenamento: o armazenamento do dispositivo raiz.
- Chame IWMDMEnumStorage::Next com uma contagem de 1 para recuperar a interface IWMDMStorage para o armazenamento do dispositivo raiz. (Não é possível solicitar mais de um filho do dispositivo.)
- Examine todos os armazenamentos no dispositivo chamando recursivamente IWMDMStorage::EnumStorage e, em seguida, IWMDMEnumStorage::Next para obter filhos de um armazenamento. Para ver se um armazenamento tem filhos para evitar as chamadas para EnumStorage e Next, você pode chamar IWMDMStorage::GetAttributes para marcar para os sinalizadores WMDM_STORAGE_ATTR_HAS_FILES ou WMDM_STORAGE_ATTR_HAS_FOLDERS. Para obter mais informações sobre como obter as propriedades de um armazenamento, consulte Obtendo e definindo metadados e atributos e obtendo e definindo metadados e atributos no aplicativo.
O Windows Media Gerenciador de Dispositivos não expõe um conjunto padrão de pastas para manter a mídia de um tipo específico (por exemplo, uma pasta "Minhas Playlists" para playlists). Cada dispositivo tem um sistema de arquivos exclusivo e você terá que decidir sobre um local apropriado para procurar ou enviar um arquivo específico.
Observação
O Windows Explorer pode mostrar pastas virtuais que não existem no dispositivo. As pastas virtuais de exemplo são as pastas "Mídia" e "Dados" exibidas para dispositivos MTP. Essas pastas são criadas pelo Windows para tornar os downloads mais simples para os usuários finais; eles realmente não existem no dispositivo. Seu aplicativo não deve depender da localização desses tipos de pastas gerais. Por outro lado, o Windows Explorer pode não mostrar algumas pastas ou objetos que existem no dispositivo (por exemplo, playlists).
O código de exemplo C++ a seguir demonstra a exploração recursiva de um dispositivo. Ele usa duas funções:
- ExploreDevice, uma função inicial que recebe um ponteiro de dispositivo e obtém um ponteiro para o enumerador raiz desse dispositivo.
- RecursiveExploreStorage, que é chamado para explorar um dispositivo recursivamente.
// 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;
}
Tópicos relacionados