C# 在读取IStream然后写入FileStream时填充观察到的字节
我在这里使用了指南:创建一个工作的c#实现,使用COM互操作从我的(佳能相机)便携式设备复制数据 我观察到,使用Windows资源管理器复制“PictureA”时,文件大小为5999261字节,磁盘上的文件大小为6000640字节 但是,当我使用c#实现时,创建的文件大小为6000640字节,磁盘上的文件大小为6000640字节(相同) 6000640是高于5999261的4096(目标磁盘分配大小(每个群集的字节))的最低倍数 因此,如果我从Windows资源管理器(复制粘贴操作)获取结果文件,并将其与c#实现创建的文件进行比较,它们在字节级别上是不同的 似乎当我使用c#实现时,它会填充字节数,直到达到磁盘分配大小的最低倍数 我想了解为什么在两种复制方法之间观察到这种行为。我想逐字节复制原始文件 以下是正在使用的方法:C# 在读取IStream然后写入FileStream时填充观察到的字节,c#,istream,C#,Istream,我在这里使用了指南:创建一个工作的c#实现,使用COM互操作从我的(佳能相机)便携式设备复制数据 我观察到,使用Windows资源管理器复制“PictureA”时,文件大小为5999261字节,磁盘上的文件大小为6000640字节 但是,当我使用c#实现时,创建的文件大小为6000640字节,磁盘上的文件大小为6000640字节(相同) 6000640是高于5999261的4096(目标磁盘分配大小(每个群集的字节))的最低倍数 因此,如果我从Windows资源管理器(复制粘贴操作)获取结果文件
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);
你不应该写字节而不是1024吗?i、 e.
targetStream.Write(缓冲区,0,字节读取)
?Read
允许返回小于请求字节数的字节。您不应该将bytesRead
字节而不是1024字节写入吗?i、 e.targetStream.Write(缓冲区,0,字节读取)代码>?Read
允许返回小于请求字节数的字节