4

MTP 経由で少なくとも 1 つのファイルを Windows Phone にコピーしたいと考えています。このチュートリアルに従って、電話機に接続し、電話機からコンピュータにファイルをコピーすることができます: WPD: コンテンツの転送 しかし、逆方向 (コンピュータから電話機) にファイルをコピーすることはできません。これは私のコードです:

IPortableDeviceContent content;
this._device.Content(out content);
IPortableDeviceValues values = GetRequiredPropertiesForContentType(fileName, parentObjectId);

PortableDeviceApiLib.IStream tempStream;
uint optimalTransferSizeBytes = 0;
content.CreateObjectWithPropertiesAndData(
     values,
     out tempStream,
     ref optimalTransferSizeBytes,
     null);

System.Runtime.InteropServices.ComTypes.IStream targetStream = (System.Runtime.InteropServices.ComTypes.IStream)tempStream;

try
{
    using (var sourceStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        var buffer = new byte[optimalTransferSizeBytes];
        int bytesRead;
        do
        {
            bytesRead = sourceStream.Read(buffer, 0, (int)optimalTransferSizeBytes);
            IntPtr pcbWritten = IntPtr.Zero;
            targetStream.Write(buffer, (int)optimalTransferSizeBytes, pcbWritten);
        } while (bytesRead > 0);

    }
    targetStream.Commit(0);
 }
 finally
 {
     Marshal.ReleaseComObject(tempStream);
 }

このコードをいくつかのデバイスでテストしました。通常の mp3 プレーヤーで動作し、チュートリアルが正しいと仮定すると、Android フォンでも動作します。しかし、このコードを 2 つの異なる Windows Phone で実行すると、次の例外が発生します。

An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in      PortableDevices.exe

Additional information: The data area passed to a system call is too small. (Exception from HRESULT: 0x8007007A)

この行で:targetStream.Write(buffer, (int)optimalTransferSizeBytes, pcbWritten);

バッファ サイズは 262144 バイトですが、ファイル サイズはわずか 75 キロバイトです。誰かがこの問題を解決する方法を知っていることを願っています。

こんにちは j0h4nn3s

4

1 に答える 1

2

私は同じ問題を抱えていましたが、作者が単純な間違いを犯したことがわかりました。読み取ったバイト数ではなく、バッファのサイズを書き込んでいます。

交換

targetStream.Write(buffer, (int)optimalTransferSizeBytes, pcbWritten);

targetStream.Write(buffer, bytesRead, pcbWritten);
于 2015-01-22T09:59:14.360 に答える