探索裝置
探索設備類似於探索硬碟。 裝置上的所有物件都會 記憶體呼叫。 記憶體可以是裝置上的檔案、資料夾或抽象物件(例如播放清單)。 您必須檢查記憶體的屬性和元資料(如果支持的話),才能瞭解記憶體的儲存類型。 存儲空間會以階層方式在裝置上組織;每個存儲只有一個父層,而且所有存儲最終都會從單一根存儲空間向下遞延,通常名為“\”。
下列步驟說明如何探索裝置:
- 取得裝置的介面 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 媒體設備管理器不會公開一組標準資料夾來保存特定類型的媒體(例如播放清單的「我的播放清單」資料夾)。 每個裝置都有唯一的文件系統,您必須決定要尋找或傳送特定檔案的適當位置。
注意
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;
}
相關主題