我已经在这里使用了指南:https://cgeers.wordpress.com/2011/08/13/wpd-transferring-content/#more-3043来创建一个有效的c#实现,它使用COM互操作从我的(佳能相机)便携式设备复制数据。
我观察到当使用Windows资源管理器复制'PictureA'时,它会导致文件大小为5,999,261字节,磁盘上的文件大小为6,000,640字节。
但是,当我使用c#实现时,创建的文件大小为6,000,640字节,磁盘上的文件大小为6,000,640字节(相同)。
6,000,640是4,096(目标磁盘磁盘分配大小(每个群集的字节数))的最低倍数,高于5,999,261。
因此,如果我从Windows资源管理器中获取生成的文件(复制粘贴操作)并将其与c#实现创建的文件进行区分,则它们在字节级别上是不同的。
当我使用c#实现时,它会填充字节数,直到达到磁盘分配大小的最低倍。
我想了解为什么在两种复制方法之间观察到这种行为。我想复制字节为原始文件的字节。
以下是使用的方法:
public void DownloadFile(PortableDeviceFile file, string saveToPath)
{
IPortableDeviceContent content;
this._device.Content(out content);
IPortableDeviceResources resources;
content.Transfer(out resources);
PortableDeviceApiLib.IStream wpdStream;
uint optimalTransferSize = 0;
var property = new _tagpropertykey();
property.fmtid = new Guid(0xE81E79BE, 0x34F0, 0x41BF, 0xB5, 0x3F,
0xF1, 0xA0, 0x6A, 0xE8, 0x78, 0x42);
property.pid = 0;
resources.GetStream(file.Id, ref property, 0, ref optimalTransferSize,
out wpdStream);
System.Runtime.InteropServices.ComTypes.IStream sourceStream =
(System.Runtime.InteropServices.ComTypes.IStream)wpdStream;
//var filename = Path.GetFileName(file.Id);
var filename = file.Name;
FileStream targetStream = new FileStream(Path.Combine(saveToPath, filename),
FileMode.Create, FileAccess.Write);
unsafe
{
var buffer = new byte[1024];
int bytesRead;
do
{
sourceStream.Read(buffer, 1024, new IntPtr(&bytesRead));
targetStream.Write(buffer, 0, 1024);
} while (bytesRead > 0);
targetStream.Close();
}
Marshal.ReleaseComObject(sourceStream);
Marshal.ReleaseComObject(wpdStream);