從裝置讀取檔案
當您找到想要從裝置複製的檔案時,就可以在單一呼叫中將檔案從裝置複製到電腦,或使用回呼將檔案位元組直接讀取到您的應用程式,然後處理或儲存符合的資料。
下列步驟顯示從單一呼叫中的裝置複製檔案的基本方式:
- 取得裝置上檔案的控制碼。 您可以使用遞迴檔案搜尋來取得控制碼,或者,如果您知道儲存體的永續性識別碼,請呼叫 IWMDMDevice3::FindStorage。 不論是哪一種情況,您都需要 物件的 IWMDMStorage 介面。
- 判斷儲存體是檔案或資料夾。 只能從裝置複製檔案。 呼叫 IWMDMStorage::GetAttributes 以取得儲存體屬性,這會告訴您儲存體是檔案或資料夾。
- 查詢IWMDMStorageControl 的 IWMDMStorageControl,並呼叫IWMDMStorageControl::Read以從裝置讀取檔案,並將它儲存至指定的位置。
如果相反地,您想要依封鎖從裝置讀取檔案區塊,則必須實作 IWMDMOperation 回 呼介面。 將此介面傳遞至IWMDMStorageControl::Read呼叫,Windows Media 裝置管理員會循序將檔案資料的區區塊轉送至回呼。 下列步驟示範如何依區塊讀取裝置檔案區塊:
- 取得儲存體的 IWMDMStorage 介面,並判斷它是否為檔案,如先前所述。
- 準備任何檔案控制代碼或其他您需要保存所接收資料的控制碼。
- 查詢儲存體的 IWMDMStorageControl 介面
- 呼叫 IWMDMStorageControl::Read 以開始讀取作業,並傳入您已實作的 IWMDMOperation 介面。
- 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;
}
相關主題