Udostępnij za pośrednictwem


Eksplorowanie urządzenia

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:

  1. Pobierz interfejs IWMDMDevice dla urządzenia zgodnie z opisem w Wyliczanie urządzeń.
  2. 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.
  3. 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).
  4. 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;
}

Tworzenie aplikacji Menedżera urządzeń Windows Media