Leer archivos desde el dispositivo
Cuando haya encontrado un archivo que le gustaría copiar desde el dispositivo, puede copiar el archivo desde el dispositivo al equipo en una sola llamada o usar una devolución de llamada para que los bytes de archivo se lean directamente en la aplicación, lo que puede procesar o almacenar los datos tal y como se ve.
Los pasos siguientes muestran la manera básica de copiar un archivo desde un dispositivo en una sola llamada:
- Obtenga un identificador para el archivo en el dispositivo. Puede obtener el identificador mediante una búsqueda de archivos recursiva o, si conoce el identificador persistente del almacenamiento, llamando a IWMDMDevice3::FindStorage. En cualquier caso, necesita la interfaz IWMDMStorage del objeto .
- Determine si el almacenamiento es un archivo o una carpeta. Solo se pueden copiar archivos desde el dispositivo. Llame a IWMDMStorage::GetAttributes para obtener atributos de almacenamiento, lo que le indicará si el almacenamiento es un archivo o una carpeta.
- Consulte IWMDMStorage para IWMDMStorageControl y llame a IWMDMStorageControl::Read para leer el archivo del dispositivo y guardarlo en una ubicación especificada.
Si, en su lugar, quiere leer el bloque de archivos por bloque del dispositivo, debe implementar la interfaz de devolución de llamada IWMDMOperation . Pase esta interfaz a la llamada IWMDMStorageControl::Read y Windows Media Administrador de dispositivos enviará fragmentos de datos de archivo secuencialmente a la devolución de llamada. En los pasos siguientes se muestra cómo leer un bloque de archivos de dispositivo por bloque:
- Obtenga la interfaz IWMDMStorage para el almacenamiento y determine si es un archivo, como se ha descrito anteriormente.
- Prepare los identificadores de archivo u otros identificadores que necesite para almacenar los datos recibidos.
- Consulta de la interfaz IWMDMStorageControl del almacenamiento
- Llame a IWMDMStorageControl::Read para comenzar la operación de lectura, pasando la interfaz IWMDMOperation que ha implementado.
- Windows Media Administrador de dispositivos enviará el bloque de datos por bloque al dispositivo, como se describe en Control manual de transferencias de archivos.
La siguiente función de ejemplo de C++ lee un objeto de almacenamiento de un dispositivo. La función acepta un puntero de interfaz IWMDMOperation opcional; si se envía, la función creará un archivo explícitamente y controlará la escritura de los datos en el archivo en su implementación de IWMDMOperation::TransferObjectData; si no es así, leerá el archivo y guardará en el destino especificado por 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;
}
Temas relacionados