使用 WPD 将文件复制到 Windows Phone C#
Copy files with WPD to Windows Phone C#
我想通过 MTP 将至少一个文件复制到 windows phone。
按照本教程,我能够连接到 phone 并将文件从 phone 复制到计算机:
WPD: Transferring Content
但是我无法以相反的方式复制文件(从计算机到 phone)。
这是我的代码:
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 phone。
但是用两个不同的 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 KB。我希望有人知道如何解决这个问题。
您好
j0h4nn3s
我也遇到了同样的问题,原来作者犯了一个简单的错误。您写的是缓冲区的大小,而不是您读取的字节数。
替换
targetStream.Write(buffer, (int)optimalTransferSizeBytes, pcbWritten);
来自
targetStream.Write(buffer, bytesRead, pcbWritten);
我想通过 MTP 将至少一个文件复制到 windows phone。 按照本教程,我能够连接到 phone 并将文件从 phone 复制到计算机: WPD: Transferring Content 但是我无法以相反的方式复制文件(从计算机到 phone)。 这是我的代码:
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 phone。 但是用两个不同的 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 KB。我希望有人知道如何解决这个问题。
您好 j0h4nn3s
我也遇到了同样的问题,原来作者犯了一个简单的错误。您写的是缓冲区的大小,而不是您读取的字节数。
替换
targetStream.Write(buffer, (int)optimalTransferSizeBytes, pcbWritten);
来自
targetStream.Write(buffer, bytesRead, pcbWritten);