gpt4 book ai didi

c# - 使用 DeflateStream 解压缩数据文件

转载 作者:太空狗 更新时间:2023-10-29 20:29:35 24 4
gpt4 key购买 nike

我在使用 C# .NET DeflateStream(..., CompressionMode.Decompress) 读取压缩(压缩)数据文件时遇到问题。该文件是早些时候使用 DeflateStream(..., CompressionMode.Compress) 编写的,看起来还不错(我什至可以使用 Java 程序解压缩它)。

但是,对输入流的第一个 Read() 调用对压缩数据进行解压缩/扩充返回长度为零(文件结尾)。

这是主要的驱动程序,用于压缩和解压:

public void Main(...)
{
Stream inp;
Stream outp;
bool compr;

...
inp = new FileStream(inName, FileMode.Open, FileAccess.Read);
outp = new FileStream(outName, FileMode.Create, FileAccess.Write);

if (compr)
Compress(inp, outp);
else
Decompress(inp, outp);

inp.Close();
outp.Close();
}

这是解压的基本代码,这是失败的地方:

public long Decompress(Stream inp, Stream outp)
{
byte[] buf = new byte[BUF_SIZE];
long nBytes = 0;

// Decompress the contents of the input file
inp = new DeflateStream(inp, CompressionMode.Decompress);

for (;;)
{
int len;

// Read a data block from the input stream
len = inp.Read(buf, 0, buf.Length); //<<FAILS
if (len <= 0)
break;

// Write the data block to the decompressed output stream
outp.Write(buf, 0, len);
nBytes += len;
}

// Done
outp.Flush();
return nBytes;
}

标记为FAILS 的调用始终返回零。为什么?我知道这一定很简单,但我就是没看到。

下面是压缩的基本代码,效果很好,和解压方法几乎一模一样,只是调换了名称:

public long Compress(Stream inp, Stream outp)
{
byte[] buf = new byte[BUF_SIZE];
long nBytes = 0;

// Compress the contents of the input file
outp = new DeflateStream(outp, CompressionMode.Compress);

for (;;)
{
int len;

// Read a data block from the input stream
len = inp.Read(buf, 0, buf.Length);
if (len <= 0)
break;

// Write the data block to the compressed output stream
outp.Write(buf, 0, len);
nBytes += len;
}

// Done
outp.Flush();
return nBytes;
}

已解决

看到正确的解法后,构造函数语句应该改为:

inp = new DeflateStream(inp, CompressionMode.Decompress, true);

保持底层输入流打开,需要在 inp.Flush() 调用之后添加以下行:

inp.Close();

Close() 调用强制 deflater 流刷新其内部缓冲区。 true 标志阻止它关闭底层流,该流稍后在 Main() 中关闭。 Compress() 方法也应进行相同的更改。

最佳答案

在你的解压缩方法中,正在将 inp 重新分配给一个新的 Stream(一个 deflate 流)。你永远不会关闭那个 Deflate 流,但你确实关闭了 Main() 中的底层文件流。压缩方法中发生了类似的事情。

我认为问题在于底层文件流在 deflate 流的终结器自动关闭它们之前被关闭。

我在您的 Decompress 和 Compress 方法中添加了 1 行代码:inp.Close()//解压缩方法

outp.Close()//到压缩方法。

更好的做法是将流包含在 using 子句中。

这是编写解压缩方法的另一种方法(我测试过,它有效)


public static long Decompress(Stream inp, Stream outp)
{
byte[] buf = new byte[BUF_SIZE];
long nBytes = 0;

// Decompress the contents of the input file
using (inp = new DeflateStream(inp, CompressionMode.Decompress))
{
int len;
while ((len = inp.Read(buf, 0, buf.Length)) > 0)
{
// Write the data block to the decompressed output stream
outp.Write(buf, 0, len);
nBytes += len;
}
}
// Done
return nBytes;
}

关于c# - 使用 DeflateStream 解压缩数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1528508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com