Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Explorar um dispositivo é semelhante a explorar 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 lista de reprodução) no dispositivo. Você deve examinar os atributos e metadados de um armazenamento (se suportado) para entender que tipo de armazenamento é. Os armazenamentos são organizados hierarquicamente no dispositivo; Cada armazenamento tem exatamente um pai, e todos os armazenamentos descendem de um único armazenamento de dispositivo raiz, normalmente chamado "\".
As etapas a seguir descrevem como explorar um dispositivo:
- Obtenha a interface IWMDMDevice de um dispositivo, conforme descrito em Enumeração de Dispositivos.
- Chame IWMDMDevice::EnumStorage para obter uma interface de IWMDMEnumStorage. Essa interface é usada para obter todos os objetos filho do armazenamento que retorna essa interface. Ao obter esta interface do dispositivo, como é o caso aqui, ela gerirá 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 uma criança a partir 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 verificar se há 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 definição de metadados e atributos e Obtendo e definição de metadados e atributos na Aplicação.
O Gerenciador de Dispositivos do Windows Media não expõe um conjunto padrão de pastas para armazenar mídia de um tipo específico (por exemplo, uma pasta "Minhas listas de reprodução" para listas de reprodução). 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 realmente não existem no dispositivo. Exemplos de pastas virtuais 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 de encontrar esses tipos de pastas gerais. Por outro lado, o Windows Explorer pode não mostrar algumas pastas ou objetos que existem no dispositivo (por exemplo, listas de reprodução).
O código de exemplo C++ a seguir demonstra a exploração recursiva de um dispositivo. Utiliza 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