Lecture de fichiers à partir de l’appareil
Une fois que vous avez trouvé un fichier que vous souhaitez copier à partir de l’appareil, vous pouvez copier le fichier de l’appareil sur l’ordinateur en un seul appel, ou utiliser un rappel pour que les octets de fichier lisent directement dans votre application, qui peut ensuite traiter ou stocker les données comme il le souhaite.
Les étapes suivantes montrent la méthode de base pour copier un fichier à partir d’un appareil dans un seul appel :
- Obtenez un handle pour le fichier sur l’appareil. Vous pouvez obtenir le handle à l’aide d’une recherche de fichiers récursive ou, si vous connaissez l’ID persistant du stockage, en appelant IWMDMDevice3::FindStorage. Dans les deux cas, vous avez besoin de l’interface IWMDMStorage de l’objet.
- Déterminez si le stockage est un fichier ou un dossier. Seuls les fichiers peuvent être copiés à partir de l’appareil. Appelez IWMDMStorage::GetAttributes pour obtenir des attributs de stockage, ce qui vous indiquera si le stockage est un fichier ou un dossier.
- Interrogez IWMDMStorage pour IWMDMStorageControl et appelez IWMDMStorageControl::Read pour lire le fichier à partir de l’appareil et l’enregistrer à un emplacement spécifié.
Si, au lieu de cela, vous souhaitez lire le bloc de fichiers par bloc à partir de l’appareil, vous devez implémenter l’interface de rappel IWMDMOperation . Transmettez cette interface à l’appel IWMDMStorageControl::Read, et Windows Media Gestionnaire de périphériques enverra des blocs de données de fichier séquentiellement à votre rappel. Les étapes suivantes montrent comment lire un bloc de fichiers d’appareil par bloc :
- Obtenez l’interface IWMDMStorage pour le stockage et déterminez s’il s’agit d’un fichier, comme décrit précédemment.
- Préparez les handles de fichiers ou autres handles dont vous avez besoin pour conserver les données reçues.
- Requête pour l’interface IWMDMStorageControl du stockage
- Appelez IWMDMStorageControl::Read pour commencer l’opération de lecture, en passant l’interface IWMDMOperation que vous avez implémentée.
- Windows Media Gestionnaire de périphériques enverra le bloc de données par bloc à votre appareil, comme décrit dans Gestion manuelle des transferts de fichiers.
L’exemple de fonction C++ suivant lit un objet de stockage à partir d’un appareil. La fonction accepte un pointeur d’interface IWMDMOperation facultatif ; si elle est envoyée, la fonction crée un fichier explicitement et gère l’écriture des données dans le fichier sur son implémentation de IWMDMOperation::TransferObjectData ; si ce n’est pas le cas, il lit le fichier et l’enregistre dans la destination spécifiée par 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;
}
Rubriques connexes