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