Изучение устройства
Изучение устройства аналогично изучению диска. Все объекты на устройстве называются хранилищами. Хранилищем может быть файл, папка или абстрактный объект (например, список воспроизведения) на устройстве. Необходимо изучить атрибуты и метаданные хранилища (если они поддерживаются), чтобы понять, какой тип хранилища это. Хранилища организованы на устройстве иерархически; Каждое хранилище имеет только один родительский элемент, и все хранилища в конечном итоге нисходит от одного корневого хранилища устройства, обычно именуемого "\".
Ниже описано, как изучить устройство.
- Получите интерфейс IWMDMDevice устройства, как описано в разделе Перечисление устройств.
- Вызовите IWMDMDevice::EnumStorage , чтобы получить интерфейс IWMDMEnumStorage . Этот интерфейс используется для получения всех дочерних объектов хранилища, возвращающего этот интерфейс. При получении этого интерфейса с устройства, как мы сейчас, он будет содержать только одно хранилище: корневое хранилище устройства.
- Вызовите IWMDMEnumStorage::Next с числом 1, чтобы получить интерфейс IWMDMStorage для корневого хранилища устройства. (Вы не можете запросить более одного дочернего элемента с устройства.)
- Проверьте все хранилища на устройстве, рекурсивно вызвав IWMDMStorage::EnumStorage , а затем IWMDMEnumStorage::Next , чтобы получить дочерние элементы хранилища. Чтобы узнать, есть ли в хранилище дочерние элементы, чтобы избежать вызовов EnumStorage и Next, можно вызвать IWMDMStorage::GetAttributes, чтобы проверка для флагов WMDM_STORAGE_ATTR_HAS_FILES или WMDM_STORAGE_ATTR_HAS_FOLDERS. Дополнительные сведения о том, как получить свойства хранилища, см. в разделах Получение и настройка метаданных и атрибутов и Получение и настройка метаданных и атрибутов в приложении.
Windows Media диспетчер устройств не предоставляет стандартный набор папок для хранения мультимедиа определенного типа (например, папку "Мои списки воспроизведения" для списков воспроизведения). Каждое устройство имеет уникальную файловую систему, и вам придется выбрать подходящее место для поиска или отправки определенного файла.
Примечание
Windows Обозреватель могут отображать виртуальные папки, которые на самом деле не существуют на устройстве. Примерами виртуальных папок являются папки "Мультимедиа" и "Данные", отображаемые для устройств MTP. Эти папки создаются Windows, чтобы упростить скачивание для конечных пользователей; на самом деле они не существуют на устройстве. Приложение не должно зависеть от поиска этих типов общих папок. И наоборот, windows Обозреватель могут не отображать некоторые папки или объекты, которые существуют на устройстве (например, списки воспроизведения).
В следующем примере кода C++ демонстрируется рекурсивное исследование устройства. В нем используются две функции:
- ExploreDevice — начальная функция, которая получает указатель на устройство и получает указатель на корневой перечислитель для этого устройства.
- RecursiveExploreStorage, который вызывается для рекурсивного изучения устройства.
// 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;
}
Связанные темы