求助,使用C#自动解压缩后缀为.gz而非.tar.gz的压缩包失败

时间:2022-07-25 16:39:51
using (GZipInputStream zipFile = new GZipInputStream(File.OpenRead(fileToUnZip)))
            {
                //创建目标文件的流
                FileStream destFile = File.Open(Path.GetFileNameWithoutExtension(fileToUnZip), FileMode.Create);
                int buffersize = 2048;//缓冲区的尺寸,一般是2048的倍数
                byte[] FileData = new byte[buffersize];//创建缓冲数据
                while (buffersize > 0)//一直读取到文件末尾
                {
                    buffersize = zipFile.Read(FileData, 0, buffersize);//读取压缩文件数据
                    destFile.Write(FileData, 0, buffersize);//写入目标文件
                }
                destFile.Close();//关闭目标文件
                zipFile.Close();//关闭压缩文件
            }

fileToUnZip是.gz文件的绝对路径
程序在 buffersize = zipFile.Read(FileData, 0, buffersize);//读取压缩文件数据这行报错,
错误是:ICSharpCode.SharpZipLib.GZip.GZipException:“Error GZIP header, first magic byte doesn't match”
在网上看了好多博客,试了好多版本都不行,求助各位大神~~~

5 个解决方案

#1


1, .gz文件你确定没有问题吗? 用第三方解压缩工具先确认下
2, .Net已经自带了GZipStream提供压缩文件的相关操作,不妨一试.
3.
while这句break条件的判断可能会有问题,可以自己试试
 

while (buffersize > 0)//一直读取到文件末尾

#2


引用 1 楼 bloodish 的回复:
1, .gz文件你确定没有问题吗? 用第三方解压缩工具先确认下
2, .Net已经自带了GZipStream提供压缩文件的相关操作,不妨一试.
3.
while这句break条件的判断可能会有问题,可以自己试试
 

while (buffersize > 0)//一直读取到文件末尾

这个.gz文件我确定没有问题,同时也没有其他应用打开这个文件,正常右键解压缩没问题
            Stream inStream = new GZipInputStream(File.OpenRead(fileToUnZip));
            GZipStream compressedStream = new GZipStream(inStream, System.IO.Compression.CompressionMode.Decompress);            
            FileStream fs = new FileStream(fileToUnZip, FileMode.Create);
            byte[] buf = new byte[1024];
            int count = 0;
            do
            {
                count = inStream.Read(buf, 0, buf.Length);
                fs.Write(buf, 0, count);
            }
            while (count > 0);
            fs.Close();
            compressedStream.Close();
            inStream.Close();
这是我另一段尝试解压缩.gz文件的代码,结果也是在 count = inStream.Read(buf, 0, buf.Length);报一样的错

而且我发现这两段代码都是读文件读到最后的时候才报错

#3


请问while (buffersize > 0)这句那里不对呢?

#4


引用 2 楼 Huawei_navyhero 的回复:
Quote: 引用 1 楼 bloodish 的回复:

1, .gz文件你确定没有问题吗? 用第三方解压缩工具先确认下
2, .Net已经自带了GZipStream提供压缩文件的相关操作,不妨一试.
3.
while这句break条件的判断可能会有问题,可以自己试试
 

while (buffersize > 0)//一直读取到文件末尾

这个.gz文件我确定没有问题,同时也没有其他应用打开这个文件,正常右键解压缩没问题
            Stream inStream = new GZipInputStream(File.OpenRead(fileToUnZip));
            GZipStream compressedStream = new GZipStream(inStream, System.IO.Compression.CompressionMode.Decompress);            
            FileStream fs = new FileStream(fileToUnZip, FileMode.Create);
            byte[] buf = new byte[1024];
            int count = 0;
            do
            {
                count = inStream.Read(buf, 0, buf.Length);
                fs.Write(buf, 0, count);
            }
            while (count > 0);
            fs.Close();
            compressedStream.Close();
            inStream.Close();
这是我另一段尝试解压缩.gz文件的代码,结果也是在 count = inStream.Read(buf, 0, buf.Length);报一样的错

而且我发现这两段代码都是读文件读到最后的时候才报错


Read返回字节数的判断放到循环里去



            while(true)
            {
                count = inStream.Read(buf, 0, buf.Length);
                if(count > 0)
                  fs.Write(buf, 0, count);
                else
                   break;
            }

#5


Error GZIP header指的压缩文件头错误,如果代码没问题,那也许是你压缩包的版本和你dll的类库所支持版本不兼容

#1


1, .gz文件你确定没有问题吗? 用第三方解压缩工具先确认下
2, .Net已经自带了GZipStream提供压缩文件的相关操作,不妨一试.
3.
while这句break条件的判断可能会有问题,可以自己试试
 

while (buffersize > 0)//一直读取到文件末尾

#2


引用 1 楼 bloodish 的回复:
1, .gz文件你确定没有问题吗? 用第三方解压缩工具先确认下
2, .Net已经自带了GZipStream提供压缩文件的相关操作,不妨一试.
3.
while这句break条件的判断可能会有问题,可以自己试试
 

while (buffersize > 0)//一直读取到文件末尾

这个.gz文件我确定没有问题,同时也没有其他应用打开这个文件,正常右键解压缩没问题
            Stream inStream = new GZipInputStream(File.OpenRead(fileToUnZip));
            GZipStream compressedStream = new GZipStream(inStream, System.IO.Compression.CompressionMode.Decompress);            
            FileStream fs = new FileStream(fileToUnZip, FileMode.Create);
            byte[] buf = new byte[1024];
            int count = 0;
            do
            {
                count = inStream.Read(buf, 0, buf.Length);
                fs.Write(buf, 0, count);
            }
            while (count > 0);
            fs.Close();
            compressedStream.Close();
            inStream.Close();
这是我另一段尝试解压缩.gz文件的代码,结果也是在 count = inStream.Read(buf, 0, buf.Length);报一样的错

而且我发现这两段代码都是读文件读到最后的时候才报错

#3


请问while (buffersize > 0)这句那里不对呢?

#4


引用 2 楼 Huawei_navyhero 的回复:
Quote: 引用 1 楼 bloodish 的回复:

1, .gz文件你确定没有问题吗? 用第三方解压缩工具先确认下
2, .Net已经自带了GZipStream提供压缩文件的相关操作,不妨一试.
3.
while这句break条件的判断可能会有问题,可以自己试试
 

while (buffersize > 0)//一直读取到文件末尾

这个.gz文件我确定没有问题,同时也没有其他应用打开这个文件,正常右键解压缩没问题
            Stream inStream = new GZipInputStream(File.OpenRead(fileToUnZip));
            GZipStream compressedStream = new GZipStream(inStream, System.IO.Compression.CompressionMode.Decompress);            
            FileStream fs = new FileStream(fileToUnZip, FileMode.Create);
            byte[] buf = new byte[1024];
            int count = 0;
            do
            {
                count = inStream.Read(buf, 0, buf.Length);
                fs.Write(buf, 0, count);
            }
            while (count > 0);
            fs.Close();
            compressedStream.Close();
            inStream.Close();
这是我另一段尝试解压缩.gz文件的代码,结果也是在 count = inStream.Read(buf, 0, buf.Length);报一样的错

而且我发现这两段代码都是读文件读到最后的时候才报错


Read返回字节数的判断放到循环里去



            while(true)
            {
                count = inStream.Read(buf, 0, buf.Length);
                if(count > 0)
                  fs.Write(buf, 0, count);
                else
                   break;
            }

#5


Error GZIP header指的压缩文件头错误,如果代码没问题,那也许是你压缩包的版本和你dll的类库所支持版本不兼容