c# gzip压缩后,解压出来文件不能用了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# gzip压缩后,解压出来文件不能用了相关的知识,希望对你有一定的参考价值。

代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Compression;

namespace GZip

public partial class Form1 : Form

public Form1()

InitializeComponent();


private void button2_Click(object sender, EventArgs e)

StreamReader sr = File.OpenText(textBox1.Text);//打开原始文件
string data = sr.ReadToEnd();//读取原始文件
sr.Close();

FileStream fc = new FileStream(textBox1.Text + ".gzip",FileMode.Create,FileAccess.Write);//创建压缩文件
GZipStream compressionStream = new GZipStream(fc,CompressionMode.Compress);//创建压缩流对象
StreamWriter writer = new StreamWriter(compressionStream);//创建写入压缩流对象
writer.Write(data);//将文件写入压缩流
writer.Flush();
writer.Dispose();
compressionStream.Dispose();
fc.Dispose();
MessageBox.Show("压缩完成");


private void button1_Click(object sender, EventArgs e)

OpenFileDialog of = new OpenFileDialog();
of.Multiselect = false;
of.ShowDialog();
textBox1.Text = of.FileName;


private void button3_Click(object sender, EventArgs e)

FileStream fc = File.OpenRead(textBox1.Text);

GZipStream cs = new GZipStream(fc, CompressionMode.Decompress);//创建解压缩流对象
StreamReader reader = new StreamReader(cs);//创建写入解压流对象
string data = reader.ReadToEnd();//读取解压缩流中的
reader.Close();
cs.Close();

StreamWriter writer = File.CreateText(textBox1.Text.Replace(".gzip",""));
writer.Write(data);
writer.Close();

MessageBox.Show("解压成功");





求解为何?是代码有问题吗?

参考技术A 压缩完以后用其他的压缩软件如rar看一下是否有问题。若没有问题那就是解压有问题

c# .net gzip压缩源码

你可以使用.net的GZipStream来实现。受以下版本支持:4.5、4、3.5、3.0、2.0
参考:
下面的示例演示如何使用 GZipStream 类压缩和解压缩文件目录。

using System;
using System.IO;
using System.IO.Compression;
namespace zip

public class Program

public static void Main()

string directoryPath = @"c:\\users\\public\\reports";
DirectoryInfo directorySelected = new DirectoryInfo(directoryPath);
foreach (FileInfo fileToCompress in directorySelected.GetFiles())

Compress(fileToCompress);

foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz"))

Decompress(fileToDecompress);


public static void Compress(FileInfo fileToCompress)

using (FileStream originalFileStream = fileToCompress.OpenRead())

if ((File.GetAttributes(fileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz")

using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz"))

using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))

originalFileStream.CopyTo(compressionStream);
Console.WriteLine("Compressed 0 from 1 to 2 bytes.",
fileToCompress.Name, fileToCompress.Length.ToString(), compressedFileStream.Length.ToString());





public static void Decompress(FileInfo fileToDecompress)

using (FileStream originalFileStream = fileToDecompress.OpenRead())

string currentFileName = fileToDecompress.FullName;
string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);
using (FileStream decompressedFileStream = File.Create(newFileName))

using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))

decompressionStream.CopyTo(decompressedFileStream);
Console.WriteLine("Decompressed: 0", fileToDecompress.Name);





追问

错误 143 “System.IO.FileStream”并不包含“CopyTo”的定义
错误 144 “System.IO.Compression.GZipStream”并不包含“CopyTo”的定义
高手,是不是还需要哪个程序集?

追答

你使用的是什么版本的.net或是VS?
这个示例是MSDN上的。应该没问题。我使用的是VS2013。.net4.5

如果你不是这个版本也没有关系。不是说没有CopyTo吗,你可以替换掉这个方法。或不调用它,或改成别的同效果的函数。总之你使用的是它的压缩功能。不是它的示例。

追问

c#.net

追答

你的.net版本是多少,你的VS是多少版本。
只要你的.net版本在2.0以上应该就可以使用。只是属性方法什么的可能会有些不同。

给你个2.0的代码参考:
http://msdn.microsoft.com/zh-cn/library/zs4f0x23(v=vs.80).aspx

追问

代码gzip压缩后  图标是这样的吗?我压缩的是.txt文件

 

如果把.txt文件去掉,那么压缩文件里面.txt的文件后缀也没有了,应该是这样的吗?

追答

图标不重要,那是你机器上安装的可处理gzip的软件对应的图标。
重要的是能解开使用,比如再使用GZipStream能解开,或使用rar能打开就是可以的。

参考技术A 用开源的吧:ICSharpCode.SharpZipLib,给你链接
http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx追问

你好,我说的是.gzip压缩,不是.zip

追答

上面只是那个dll的名称,你应该点击下我给你的链接去看下说明:
#ziplib (SharpZipLib, formerly NZipLib) is a Zip, GZip, Tar and BZip2 library written entirely in C# for the .NET platform.

另外,如果你的目的只是在.net完全版下用,可以参考:
public static byte[] CompressData(byte[] data)

using (MemoryStream msOut = new MemoryStream())

GZipStream gzs = new GZipStream(msOut, CompressionMode.Compress, true);
gzs.Write(data, 0, data.Length);//压缩并写入内存
gzs.Close();
return msOut.ToArray();

追问

  高手,我对.gzip一点都不熟悉   y压缩后的图标是 这样的吗?

 双击打开后里面是

 

这样的

还是这样的?

 

指点一下吧,头都晕了

追答

文件一般是从其扩展名判断其类型(但扩展名也是可以随便改的,扩展名主要告诉系统该用什么软件打开这个文件才正确),至于显示的图标就更没关系了,你现在是用winrar关联打开,如果用其他软件则会显示其他图标。

以上是关于c# gzip压缩后,解压出来文件不能用了的主要内容,如果未能解决你的问题,请参考以下文章

gzip压缩

文件压缩解压

压缩解压归档

Linux 压缩解压

压缩解压缩命令

C#实现通过Gzip来对数据进行压缩和解压