共用方式為


探索裝置

探索裝置類似于探索磁片磁碟機。 裝置上的所有物件稱為 儲存體。 儲存體可以是檔案、資料夾或抽象物件 (,例如裝置上的播放清單) 。 如果支援) 瞭解儲存體的屬性和中繼資料,您必須檢查儲存體的屬性和中繼資料 (,以瞭解儲存體的類型。 儲存體會以階層方式在裝置上組織;每個儲存體都只有一個父系,而且所有儲存體最終都會從單一根裝置儲存體遞減,通常名為 「\」。

下列步驟說明如何探索裝置:

  1. 取得裝置的 IWMDMDevice 介面,如 列舉裝置中所述。
  2. 呼叫 IWMDMDevice::EnumStorage 以擷取 IWMDMEnumStorage 介面。 這個介面可用來取得傳回此介面之儲存體的所有子物件。 從裝置取得此介面時,如同我們在這裡,它只會保留一個儲存體:根裝置儲存體。
  3. 呼叫 IWMDMEnumStorage::Next ,其計數為 1,以擷取根裝置儲存體的 IWMDMStorage 介面。 (您無法從 device.) 要求多個子系
  4. 以遞迴方式呼叫 IWMDMStorage::EnumStorage ,然後 IWMDMEnumStorage::Next 來取得儲存體的子系,以檢查裝置上的所有儲存體。 若要查看儲存體是否有子系以避免呼叫 EnumStorageNext,您可以呼叫 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;
}

建立 Windows 媒體裝置管理員應用程式