共用方式為


從裝置讀取檔案

當您找到想要從裝置複製的檔案時,就可以在單一呼叫中將檔案從裝置複製到電腦,或使用回呼將檔案位元組直接讀取到您的應用程式,然後處理或儲存符合的資料。

下列步驟顯示從單一呼叫中的裝置複製檔案的基本方式:

  1. 取得裝置上檔案的控制碼。 您可以使用遞迴檔案搜尋來取得控制碼,或者,如果您知道儲存體的永續性識別碼,請呼叫 IWMDMDevice3::FindStorage。 不論是哪一種情況,您都需要 物件的 IWMDMStorage 介面。
  2. 判斷儲存體是檔案或資料夾。 只能從裝置複製檔案。 呼叫 IWMDMStorage::GetAttributes 以取得儲存體屬性,這會告訴您儲存體是檔案或資料夾。
  3. 查詢IWMDMStorageControl 的 IWMDMStorageControl,並呼叫IWMDMStorageControl::Read以從裝置讀取檔案,並將它儲存至指定的位置。

如果相反地,您想要依封鎖從裝置讀取檔案區塊,則必須實作 IWMDMOperation 回 呼介面。 將此介面傳遞至IWMDMStorageControl::Read呼叫,Windows Media 裝置管理員會循序將檔案資料的區區塊轉送至回呼。 下列步驟示範如何依區塊讀取裝置檔案區塊:

  1. 取得儲存體的 IWMDMStorage 介面,並判斷它是否為檔案,如先前所述。
  2. 準備任何檔案控制代碼或其他您需要保存所接收資料的控制碼。
  3. 查詢儲存體的 IWMDMStorageControl 介面
  4. 呼叫 IWMDMStorageControl::Read 以開始讀取作業,並傳入您已實作的 IWMDMOperation 介面。
  5. Windows Media 裝置管理員會依封鎖將資料區區塊轉送到您的裝置,如手動處理檔案傳輸中所述。

下列 C++ 範例函式會從裝置讀取儲存體物件。 函式接受選擇性 IWMDMOperation 介面指標;如果提交,函式會明確建立檔案,並在其 IWMDMOperation::TransferObjectData的實作上處理將資料寫入檔案;如果不是,則會讀取檔案,並儲存至 pwszDestName所指定的目的地。

HANDLE m_File = NULL;

HRESULT myFileRead(IWMDMStorage pStorage, LPWSTR pwszDestName, IWMDMOperation* pOperation)
{
    HRESULT hr = S_OK;
    if ((pStorage == NULL) || (pwszDestName == NULL)) 
    {
        return E_INVALIDPARAM;
    }

    // Check that the storage is readable.
    DWORD attributes = 0;
    UINT flags = 0;
    hr = pStorage->GetAttributes(&attributes, NULL); 
    if (FAILED(hr))
    {
        return hr;
    }

    // Check that content is readable.
    if ((attributes & WMDM_FILE_ATTR_CANREAD) == 0)
    {
        return E_FAIL;
    }
    // Check that it is not abstract (such as an abstract playlist).
    else if (attributes & WMDM_STORAGE_ATTR_VIRTUAL)
    {
        return E_FAIL;
    }

    // Set some flag values for the read operation.
    flags |= WMDM_MODE_BLOCK;
    if (attributes & WMDM_FILE_ATTR_FOLDER)
    {
        flags |= WMDM_CONTENT_FOLDER;
    }
    if (attributes & WMDM_FILE_ATTR_FILE)
    {
        flags |= WMDM_CONTENT_FILE;
    }

    // Get the IWMDMStorageControl interface.
    CComQIPtr<IWMDMStorageControl> pStgControl(pStorage);
    
    // Extra steps if we want to read the file ourselves using IWMDMOperation3.
    if (pOperation != NULL)
    {
        // Create a new file and get the handle. m_File is a global variable
        // that we will use in IWMDMOperation::TransferObjectData.
        // This can also be done when IWMDMOperation::BeginRead is called.
        m_File = CreateFile(
            pwszDestName,   // Destination file name.
            GENERIC_WRITE,  // Write and append writes
            NULL,           // File can't be shared while using, and must be closed.
            NULL,           // Handle can't be inherited.
            CREATE_ALWAYS,  // Overwrite existing files.
            FILE_ATTRIBUTE_NORMAL, // No special attributes.
            NULL            // No template file supplied.
           );
        if (m_File == INVALID_HANDLE_VALUE) return E_FAIL;
        // Modify the Read() method flag. WMDM_CONTENT_FILE and WMDM_CONTENT_FOLDER 
        // are not valid flags when pOperation != NULL.
        flags |= WMDM_CONTENT_OPERATIONINTERFACE;
    }

    // Read the file.
    hr = pStgControl->Read(
             flags,        // Synchronous call specified.
             pwszDestName, // Ignored if pOperation is not NULL.
             NULL,         // No progress callback sent.
             pOperation);  // IWMDMOperation interface, if provided.
    return hr;
}

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