다음을 통해 공유


디바이스 탐색

디바이스 탐색은 디스크 드라이브를 탐색하는 것과 비슷합니다. 디바이스의 모든 개체를 스토리지라고 합니다. 스토리지는 디바이스의 파일, 폴더 또는 추상 개체(예: 재생 목록)일 수 있습니다. 스토리지의 특성 및 메타데이터(지원되는 경우)를 검사하여 스토리지의 종류를 이해해야 합니다. 스토리지는 디바이스에서 계층적으로 구성됩니다. 모든 스토리지에는 정확히 하나의 부모가 있으며, 모든 스토리지는 궁극적으로 단일 루트 디바이스 스토리지(일반적으로 "\")에서 내림차순입니다.

다음 단계에서는 디바이스를 탐색하는 방법을 설명합니다.

  1. 디바이스열거에 설명된 대로 디바이스의 IWMDMDevice 인터페이스를 가져옵니다.
  2. IWMDMDevice::EnumStorage 호출하여 IWMDMEnumStorage 인터페이스를 검색합니다. 이 인터페이스는 이 인터페이스를 반환하는 스토리지의 모든 자식 개체를 가져오는 데 사용됩니다. 여기서와 같이 디바이스에서 이 인터페이스를 가져오는 경우 루트 디바이스 스토리지라는 하나의 스토리지만 보유합니다.
  3. IWMDMEnumStorage::Next을(를) 1개 호출하여 루트 장치 저장소의 IWMDMStorage 인터페이스를 검색합니다. (디바이스에서 둘 이상의 자식은 요청할 수 없습니다.)
  4. IWMDMStorage::EnumStorage재귀적으로 호출하여 디바이스의 모든 스토리지를 검사한 다음, IWMDMEnumStorage::Next 스토리지의 자식을 가져옵니다. 스토리지에 자식 항목이 있는지 확인하여 EnumStorageNext 호출을 피하려면, 플래그 WMDM_STORAGE_ATTR_HAS_FILES 또는 WMDM_STORAGE_ATTR_HAS_FOLDERS를 확인하기 위해 IWMDMStorage::GetAttributes를 호출할 수 있습니다. 스토리지의 속성을 가져오는 방법에 대한 자세한 내용은 메타데이터 및 특성 가져오기 및 설정, 애플리케이션 메타데이터 및 특성 가져오기 및 설정참조하세요.

Windows Media Device Manager는 특정 유형의 미디어를 보관할 표준 폴더 집합을 노출하지 않습니다(예: 재생 목록의 경우 "내 재생 목록" 폴더). 모든 디바이스에는 고유한 파일 시스템이 있으며 특정 파일을 찾거나 보낼 적절한 위치를 결정해야 합니다.

메모

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 Media Device Manager 애플리케이션 만들기