Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Eksplorowanie urządzenia jest podobne do eksplorowania dysku. Wszystkie obiekty na urządzeniu są nazywane pamięciami . Magazyn może być plikiem, folderem lub obiektem abstrakcyjnym (takim jak lista odtwarzania) na urządzeniu. Aby dowiedzieć się, jaki jest rodzaj magazynu, należy sprawdzić atrybuty i metadane magazynu (jeśli są obsługiwane). Magazyny są zorganizowane hierarchicznie na urządzeniu; każdy magazyn ma dokładnie jeden element nadrzędny, a wszystkie magazyny ostatecznie pochodzą z jednego magazynu urządzenia głównego, zazwyczaj o nazwie "\".
W poniższych krokach opisano sposób eksplorowania urządzenia:
- Pobierz interfejs IWMDMDevice dla urządzenia zgodnie z opisem w Wyliczanie urządzeń.
- Wywołaj IWMDMDevice::EnumStorage, aby pobrać interfejs IWMDMEnumStorage. Ten interfejs służy do uzyskiwania dostępu do wszystkich obiektów podrzędnych magazynu, który to interfejs zwraca. Podczas uzyskiwania tego interfejsu z urządzenia, tak jak w naszym przypadku, będzie obsługiwać tylko jeden rodzaj pamięci: pamięć urządzenia głównego.
- Wywołaj IWMDMEnumStorage::Next z liczbą 1, aby pobrać interfejs IWMDMStorage dla pamięci głównego urządzenia. (Nie można zażądać więcej niż jednego dziecka z urządzenia).
- Sprawdź wszystkie pamięci na urządzeniu, rekursywnie wywołując IWMDMStorage::EnumStorage, a następnie IWMDMEnumStorage::Next, aby pobrać dzieci pamięci. Aby sprawdzić, czy magazyn ma elementy podrzędne, aby uniknąć wywołań EnumStorage i Next, możesz wywołać IWMDMStorage::GetAttributes, aby sprawdzić flagi WMDM_STORAGE_ATTR_HAS_FILES lub WMDM_STORAGE_ATTR_HAS_FOLDERS. Aby uzyskać więcej informacji na temat pobierania właściwości magazynu, zobacz Pobieranie i ustawianie metadanych i atrybutów oraz Pobieranie i ustawianie metadanych i atrybutów w aplikacji.
Menedżer urządzeń z systemem Windows Media nie udostępnia standardowego zestawu folderów do przechowywania nośników określonego typu (na przykład folderu "Moje listy odtwarzania" dla list odtwarzania). Każde urządzenie ma unikatowy system plików i trzeba będzie zdecydować o odpowiednim miejscu do wyszukania lub wysłania określonego pliku.
Notatka
Eksplorator Windows może wyświetlać foldery wirtualne, które nie istnieją na urządzeniu. Przykładowe foldery wirtualne to foldery "Nośnik" i "Dane" wyświetlane dla urządzeń MTP. Te foldery są tworzone przez system Windows w celu uproszczenia pobierania dla użytkowników końcowych; w rzeczywistości nie istnieją na urządzeniu. Aplikacja nie powinna zależeć od znalezienia tego typu folderów ogólnych. Z drugiej strony Eksplorator Windows może nie wyświetlać niektórych folderów lub obiektów, które istnieją na urządzeniu (na przykład listy odtwarzania).
Poniższy przykładowy kod języka C++ demonstruje rekursywną eksplorację urządzenia. Używa dwóch funkcji:
- ExploreDevice, funkcja początkowa, która odbiera wskaźnik urządzenia i uzyskuje wskaźnik do głównego enumeratora dla tego urządzenia.
- RecursiveExploreStorage, który jest wywoływany w celu eksplorowania urządzenia rekursywnie.
// 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;
}
Tematy pokrewne