流.CopyTo不复制任何流数据



我有一个问题,从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文件的页眉和页脚是由第一个实现写入的。

stream . copyto()从流的当前位置开始复制。在LoadIntoStream()调用之后,它可能不是0。因为它是一个MemoryStream,你可以简单地像这样修复它:

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

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

正如其他人所说,Position可能不再是0。但是,您不能总是将Position设置回0,例如对于Network和Compressed streams。在做任何操作之前,你应该检查stream.CanSeek属性,如果它是false,那么首先将流复制到一个新的MemoryStream(可以寻求),然后在每次操作后改变位置,将Position设置回0。

相关内容

  • 没有找到相关文章

最新更新