【问题标题】:Stream.CopyTo not copying any stream dataStream.CopyTo 不复制任何流数据
【发布时间】:2014-08-04 15:29:16
【问题描述】:

我在将数据从 MemoryStream 复制到 ZipArchive 内的 Stream 时遇到问题。以下不工作 - 它只返回 114 个字节:

GetDataAsByteArray(IDataSource dataSource)
{
    using (var zipStream = new MemoryStream())
    {
        using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
        {
            var file = archive.CreateEntry("compressed.file");
            using (var targetStream = file.Open())
            {
                using (var sourceStream = new MemoryStream())
                {
                    await dataSource.LoadIntoStream(sourceStream);
                    sourceStream.CopyTo(targetStream);
                }
            }
        }
        var result = zipStream.ToArray();
        zipStream.Close();
        return result;
    }
}

但是,对于“复制”过程,使用下面的实现,所有 1103 个字节都被写入数组/内存流:

await targetStream.WriteAsync(sourceStream.ToArray(), 0, (int) sourceStream.Length);

我想知道为什么CopyTo 产生的字节更少。此外,在第二次实施中,我对Int32 的演员表感到不安全。

仅供参考:比较字节数组:看起来只有 zip 文件的页眉和页脚是由第一个实现编写的。

【问题讨论】:

    标签: c# stream zip memorystream


    【解决方案1】:

    Stream.CopyTo() 从流的当前位置开始复制。在 LoadIntoStream() 调用之后,这可能不是 0。由于它是 MemoryStream,您可以像这样简单地修复它:

        await dataSource.LoadIntoStream(sourceStream);
        sourceStream.Position = 0;
        sourceStream.CopyTo(targetStream);
    

    【讨论】:

    • 谢谢汉斯!! 6 年后,仍然是一篇有用的帖子。
    • 好的,谢谢汉斯。 7年后的现在。另请注意,如果您有基类 Stream(不是专门的 MemoryStream),那么您可以使用:justAStream.Seek(0, SeekOrigin.Begin);
    【解决方案2】:

    在复制之前设置sourceStream.Position = 0。副本将从当前位置复制到流的末尾。

    【讨论】:

      【解决方案3】:

      正如其他人所说,Position 可能不再是 0。但您不能总是将 Position 设置回 0,例如对于网络和压缩流。您应该在执行任何操作之前检查stream.CanSeek 属性,如果它是false,则首先将流复制到新的MemoryStream(可以查找),然后在每次更改位置的操作之后将Position 设置回0.

      【讨论】:

      • 原来的问题是因为位置的关系,复制不起作用。所以你建议先复制它:D?还是我错过了什么?
      • @fl034 先将其复制到内存流中,然后使用内存流而不是原始流。不,首先对它做一些改变位置的事情,然后尝试从原始流中复制它。那是行不通的。
      猜你喜欢
      • 2015-07-13
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2021-12-26
      • 2018-04-08
      相关资源
      最近更新 更多