Share via


Lesen von Dateien vom Gerät

Wenn Sie eine Datei gefunden haben, die Sie vom Gerät kopieren möchten, können Sie die Datei in einem einzelnen Aufruf vom Gerät auf den Computer kopieren oder einen Rückruf verwenden, um die Dateibytes direkt in Ihre Anwendung lesen zu lassen, die die Daten dann nach Bedarf verarbeiten oder speichern kann.

Die folgenden Schritte zeigen die grundlegende Möglichkeit zum Kopieren einer Datei von einem Gerät in einem einzigen Aufruf:

  1. Rufen Sie ein Handle für die Datei auf dem Gerät ab. Sie können das Handle mithilfe einer rekursiven Dateisuche oder, wenn Sie die persistente ID des Speichers kennen, durch Aufrufen von IWMDMDevice3::FindStorage abrufen. In beiden Fällen benötigen Sie die IWMDMStorage-Schnittstelle des -Objekts.
  2. Bestimmen Sie, ob es sich bei dem Speicher um eine Datei oder einen Ordner handelt. Nur Dateien können vom Gerät kopiert werden. Rufen Sie IWMDMStorage::GetAttributes auf, um Speicherattribute abzurufen, die Ihnen mitteilen, ob es sich bei dem Speicher um eine Datei oder einen Ordner handelt.
  3. Fragen Sie IWMDMStorage für IWMDMStorageControl ab, und rufen Sie IWMDMStorageControl::Read auf, um die Datei vom Gerät zu lesen und an einem angegebenen Speicherort zu speichern.

Wenn Sie stattdessen die Datei Block für Block vom Gerät lesen möchten, müssen Sie die IWMDMOperation-Rückrufschnittstelle implementieren. Übergeben Sie diese Schnittstelle an den IWMDMStorageControl::Read-Aufruf, und Windows Media Geräte-Manager sendet Sequenzielle Dateidatenblöcke an Ihren Rückruf. Die folgenden Schritte zeigen, wie Sie eine Gerätedatei Block für Block lesen:

  1. Rufen Sie die IWMDMStorage-Schnittstelle für den Speicher ab, und ermitteln Sie, ob es sich um eine Datei handelt, wie zuvor beschrieben.
  2. Bereiten Sie alle Dateihandles oder andere Handles vor, die Sie für die empfangenen Daten benötigen.
  3. Abfragen der IWMDMStorageControl-Schnittstelle des Speichers
  4. Rufen Sie IWMDMStorageControl::Read auf, um den Lesevorgang zu beginnen, und übergeben Sie die von Ihnen implementierte IWMDMOperation-Schnittstelle .
  5. Windows Media Geräte-Manager sendet den Datenblock für Block an Ihr Gerät, wie unter Manuelles Behandeln von Dateiübertragungen beschrieben.

Die folgende C++-Beispielfunktion liest ein Speicherobjekt von einem Gerät. Die Funktion akzeptiert einen optionalen IWMDMOperation-Schnittstellenzeiger . wenn übermittelt, erstellt die Funktion explizit eine Datei und verarbeitet das Schreiben der Daten in die Datei für die Implementierung von IWMDMOperation::TransferObjectData; andernfalls wird die Datei gelesen und an dem von pwszDestName angegebenen Ziel gespeichert.

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;
}

Erstellen einer Windows Media-Geräte-Manager-Anwendung