在.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 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
)获得