C# 在读取IStream然后写入FileStream时填充观察到的字节

C# 在读取IStream然后写入FileStream时填充观察到的字节,c#,istream,C#,Istream,我在这里使用了指南:创建一个工作的c#实现,使用COM互操作从我的(佳能相机)便携式设备复制数据 我观察到,使用Windows资源管理器复制“PictureA”时,文件大小为5999261字节,磁盘上的文件大小为6000640字节 但是,当我使用c#实现时,创建的文件大小为6000640字节,磁盘上的文件大小为6000640字节(相同) 6000640是高于5999261的4096(目标磁盘分配大小(每个群集的字节))的最低倍数 因此,如果我从Windows资源管理器(复制粘贴操作)获取结果文件

我在这里使用了指南:创建一个工作的c#实现,使用COM互操作从我的(佳能相机)便携式设备复制数据

我观察到,使用Windows资源管理器复制“PictureA”时,文件大小为5999261字节,磁盘上的文件大小为6000640字节

但是,当我使用c#实现时,创建的文件大小为6000640字节,磁盘上的文件大小为6000640字节(相同)

6000640是高于5999261的4096(目标磁盘分配大小(每个群集的字节))的最低倍数

因此,如果我从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);

你不应该写字节而不是1024吗?i、 e.
targetStream.Write(缓冲区,0,字节读取)
Read
允许返回小于请求字节数的字节。您不应该将
bytesRead
字节而不是1024字节写入吗?i、 e.
targetStream.Write(缓冲区,0,字节读取)
Read
允许返回小于请求字节数的字节