在.net 2.0中在两个流之间复制

本文关键字:两个 复制 之间 net | 更新日期: 2023-09-27 18:08:41

我一直在使用以下代码来压缩。net 4.0中的数据:

public static byte[] CompressData(byte[] data_toCompress)
{
    using (MemoryStream outFile = new MemoryStream())
    {
        using (MemoryStream inFile = new MemoryStream(data_toCompress))
        using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
        {
            inFile.CopyTo(Compress);
        }
        return outFile.ToArray();
    }
}

然而,在。net 2.0 Stream。CopyTo方法不可用。所以,我试着做一个替换:

public static byte[] CompressData(byte[] data_toCompress)
{
    using (MemoryStream outFile = new MemoryStream())
    {
        using (MemoryStream inFile = new MemoryStream(data_toCompress))
        using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
        {
            //inFile.CopyTo(Compress);
            Compress.Write(inFile.GetBuffer(), (int)inFile.Position, (int)(inFile.Length - inFile.Position));
        }
        return outFile.ToArray();
    }
}
但是,当使用上面的尝试时,压缩失败了-我得到一个错误说:

MemoryStream的内部缓冲区无法访问。

在这个问题上有谁能提供帮助吗?我真不知道还能做些什么。

谢谢你,埃文

在.net 2.0中在两个流之间复制

这是直接从.Net 4.0 Stream.CopyTo方法(bufferSize为4096)的代码:

byte[] buffer = new byte[bufferSize];
int count;
while ((count = this.Read(buffer, 0, buffer.Length)) != 0)
    destination.Write(buffer, 0, count);

既然你已经可以访问数组了,为什么不这样做呢:

using (MemoryStream outFile = new MemoryStream())
{
    using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
    {
        Compress.Write(data_toCompress, 0, data_toCompress.Length);
    }
    return outFile.ToArray();
}

最有可能在示例代码中,您使用inFile.GetBuffer()将抛出异常,因为您没有使用正确的构造函数-并非所有MemoryStream实例都允许您访问内部缓冲区-您必须在文档中查找此:

类初始化MemoryStream类的新实例指定的字节数组区域,CanWrite属性设置为,以及调用指定的的GetBuffer集合的能力。

这应该可以工作-但在建议的解决方案中无论如何都不需要:

using (MemoryStream inFile = new MemoryStream(data_toCompress, 
                                              0, 
                                              data_toCompress.Length, 
                                              false, 
                                              true))

为什么要用数组构建内存流,然后试图将数组拉出内存流?

你可以直接写Compress.Write(data_toCompress, 0, data_toCompress.Length);

如果您需要替换CopyTo的功能,您可以创建一个一定长度的缓冲区数组,从源流读取数据并将该数据写入目标流。

你可以试试

infile.WriteTo(Compress);

尝试替换行:

Compress.Write(inFile.GetBuffer(), (int)inFile.Position, (int)(inFile.Length - inFile.Position));

:

Compress.Write(data_toCompress, 0, data_toCompress.Length);

你可以完全去掉这一行:

using (MemoryStream inFile = new MemoryStream(data_toCompress))

编辑:在这里找到一个例子:为什么gzip/deflate压缩一个小文件会导致许多末尾的零?

你应该在这两个流之间手动读写:

    private static void CopyStream(Stream from, Stream to)
    {
        int bufSize = 1024, count;
        byte[] buffer = new byte[bufSize];
        count = from.Read(buffer, 0, bufSize);
        while (count > 0)
        {
            to.Write(buffer, 0, count);
            count = from.Read(buffer, 0, bufSize);
        }
    }

开源NuGet包流。CopyTo为所有版本的。net框架实现了Stream.CopyTo

可通过GitHub和NuGet (Install-Package Stream.CopyTo)获得