读取IStream然后编写FileStream

时间:2016-04-17 19:53:39

标签: c# istream

我已经在这里使用了指南: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);

0 个答案:

没有答案