原文链接:https://www.cnblogs.com/sunyaling/archive/2009/04/13/1434602.html

在C#中实现文件的压缩和解压缩,需要使用第三方的组建完成。常用的是:SharpZipLib组件。

1、压缩和解压缩有两种典型的算法,一种是BZIP2算法,另一种是GZIP算法。BZIP2能够获得较高的压缩比,但是压缩和解压缩比较耗时,GZIP效率比较高,但是压缩比较低。

2、BZIP2压缩算法的相关类,位于命名空间:ICSharpCode.SharpZipLib.BZip2中,算法要求指定输入流和输出流,并指定压缩方法使用的块大小,一般为2048.

3、GZIP压缩算法的相关类,位于命名空间:ICSharpCode.SharpZipLib.GZip中,首先创建GZipOutputStream类实例,作为压缩文件的输出流,使用GZipOutputStream类实例的Write方法,将从源文件读取的数据写入输入流。同时完成压缩运算。

4、使用实例:

class ZipAndUnzipFile
{
public static void GetZipAndUnzipFile(){ string srcFile = @"..\..\testzip.txt";//准备压缩的文件路径
string zipFile = @"..\..\testzip";//压缩后的文件路径
string unzipFile = @"..\..\testzip_unzip.txt";//解压后的文件路径
Console.WriteLine("使用BZIP开始压缩文件……");
if (BZipFile(srcFile, zipFile + ".bz"))//使用BZIP压缩文件
{
Console.WriteLine("文件压缩完成");
}
else
{
Console.WriteLine("文件压缩失败");
}
Console.WriteLine("使用BZIP开始解压文件……");
if (UnBzipFile(zipFile + ".bz", unzipFile))//使用BZIP解压文件
{
Console.WriteLine("文件解压完成");
}
else
{
Console.WriteLine("文件解压失败");
}
Console.WriteLine("使用GZIP开始压缩文件……");
if (GZipFile(srcFile, zipFile + ".gz"))//使用GZIP压缩文件
{
Console.WriteLine("文件压缩完成");
}
else
{
Console.WriteLine("文件压缩失败");
}
Console.WriteLine("使用GZIP开始解压文件……");
if (UnGzipFile(zipFile + ".gz", unzipFile))//使用GZIP解压文件
{
Console.WriteLine("文件解压完成");
}
else
{
Console.WriteLine("文件解压失败");
}
Console.ReadLine();
}
//使用BZIP压缩文件的方法
static bool BZipFile(string sourcefilename, string zipfilename)
{
bool blResult;//表示压缩是否成功的返回结果
//为源文件创建文件流实例,作为压缩方法的输入流参数
FileStream srcFile = File.OpenRead(sourcefilename);
//为压缩文件创建文件流实例,作为压缩方法的输出流参数
FileStream zipFile = File.Open(zipfilename, FileMode.Create);
try
{
//以4096字节作为一个块的方式压缩文件
BZip2.Compress(srcFile, zipFile, 4096);
blResult=true;
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
blResult=false;
}
srcFile.Close();//关闭源文件流
zipFile.Close();//关闭压缩文件流
return blResult;
}
//使用BZIP解压文件的方法
static bool UnBzipFile(string zipfilename,string unzipfilename)
{
bool blResult;//表示解压是否成功的返回结果
//为压缩文件创建文件流实例,作为解压方法的输入流参数
FileStream zipFile = File.OpenRead(zipfilename);
//为目标文件创建文件流实例,作为解压方法的输出流参数
FileStream destFile = File.Open(unzipfilename, FileMode.Create);
try
{
BZip2.Decompress(zipFile, destFile);//解压文件
blResult=true;
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
blResult=false;
}
destFile.Close();//关闭目标文件流
zipFile.Close();//关闭压缩文件流
return blResult;
}
//使用GZIP压缩文件的方法
static bool GZipFile(string sourcefilename, string zipfilename)
{
bool blResult;//表示压缩是否成功的返回结果
//为源文件创建读取文件的流实例
FileStream srcFile = File.OpenRead(sourcefilename);
//为压缩文件创建写入文件的流实例,
GZipOutputStream zipFile = new GZipOutputStream(File.Open(zipfilename,FileMode.Create));
try
{
byte[] FileData = new byte[srcFile.Length];//创建缓冲数据
srcFile.Read(FileData, 0, (int)srcFile.Length);//读取源文件
zipFile.Write(FileData, 0, FileData.Length);//写入压缩文件
blResult = true;
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
blResult = false;
}
srcFile.Close();//关闭源文件
zipFile.Close();//关闭压缩文件
return blResult;
}
//使用GZIP解压文件的方法
static bool UnGzipFile(string zipfilename, string unzipfilename)
{
bool blResult;//表示解压是否成功的返回结果
//创建压缩文件的输入流实例
GZipInputStream zipFile = new GZipInputStream(File.OpenRead(zipfilename));
//创建目标文件的流
FileStream destFile = File.Open(unzipfilename, FileMode.Create);
try
{
int buffersize = 2048;//缓冲区的尺寸,一般是2048的倍数
byte[] FileData = new byte[buffersize];//创建缓冲数据
while(buffersize>0)//一直读取到文件末尾
{
buffersize = zipFile.Read(FileData,0,buffersize);//读取压缩文件数据
destFile.Write(FileData,0,buffersize);//写入目标文件
}
blResult = true;
}
catch(Exception ee)
{
Console.WriteLine(ee.Message);
blResult = false;
}
destFile.Close();//关闭目标文件
zipFile.Close();//关闭压缩文件
return blResult;
}
}

使用GZIP的压缩,代码如下:

private void btnZipUpLoad_Click(object sender, System.EventArgs e)
{
string fileName = fileUp3.PostedFile.FileName.ToLower();
if(fileName.Length < 5)
{
btnExport3.Enabled = false;
Utils.MessageBox("请选择txt文件");
return;
}
if(!fileName.EndsWith(".txt"))
{
Utils.MessageBox("请选择txt类型文件");
return;
} string dir = Server.MapPath("~/IVR/");
if(!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
fileName = dir+"//ggld.txt";
//这里要先上传再压缩,否则会找不到路径,服务器端不能读取客户端的文件并压缩,不然服务器端不是可以操纵客户端任何的文件,包括格盘子
fileUp3.PostedFile.SaveAs(fileName);
bool flag = false;
FileStream srcFile = File.OpenRead(fileName);//要压缩的文件放在此,服务器上了。为源文件创建读取文件的流实例
//为压缩文件创建写入文件的流实例
GZipOutputStream zipFile = new GZipOutputStream(File.Open(dir+"ggld.zip",FileMode.Create));
try
{
byte[] FileDate = new byte[srcFile.Length];//创建缓冲数据
srcFile.Read(FileDate,0,(int)srcFile.Length);//读取源文件
zipFile.Write(FileDate,0,FileDate.Length);//写入压缩文件
flag = true;
}
catch(Exception ee)
{
string s = ee.Message;
flag = false;
}
srcFile.Close();
zipFile.Close();
if(flag == true)
{
Response.Redirect("http://219.137.192.203:8080/ivr_stock/ivr_stock.php?SOURCE=ivr_stock&DEST=ld&CONTENT=aHR0cDovL2NoYXQuY25xc3EuY29tL2JjaGF0YXNweC9JVlIvZ2dsZC56aXA=");
}
}

GZIP最终压缩为gz格式的压缩文件,而不是zip格式的压缩文件,一开始不明白乱用一气,但方法是对的。

下面介绍如假包换的zip压缩文件的方法,其实都大同小异:

ZipOutputStream zipFile= new ZipOutputStream(File.Open(dir+"ggld.zip",FileMode.Create));
//GZipOutputStream zipFile = new GZipOutputStream(File.Open(dir+"ggld.zip",FileMode.Create));
try
{
byte[] FileDate = new byte[srcFile.Length];//创建缓冲数据
srcFile.Read(FileDate,0,(int)srcFile.Length);//读取源文件
ZipEntry entry = new ZipEntry(fileName);//新建实例
entry.DateTime = DateTime.Now;
entry.Size = srcFile.Length;
srcFile.Close();
zipFile.PutNextEntry(entry);
zipFile.Write(FileDate,0,FileDate.Length);//写入压缩文件
flag = true;
}
catch(Exception ee)
{
string s = ee.Message;
flag = false;
}
zipFile.Finish();
zipFile.Close();
if(flag == true)
{
Response.Redirect("http://219.137.192.203:8080/ivr_stock/ivr_stock.php?SOURCE=ivr_stock&DEST=ld&CONTENT=aHR0cDovL2NoYXQuY25xc3EuY29tL2JjaGF0YXNweC9JVlIvZ2dsZC56aXA="); }

C#实现文件的压缩和解压缩的更多相关文章

  1. Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)

    1.压缩和解压缩命令    常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令        zip 压缩文件名 源文件:压缩文件   ...

  2. [Java 基础] 使用java.util.zip包压缩和解压缩文件

    reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...

  3. 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期

    [源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...

  4. IOS开发之网络编程--文件压缩和解压缩

    前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个 ...

  5. 在C#中利用SharpZipLib进行文件的压缩和解压缩收藏

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net(http://www.icsharpcode.net/OpenSource/SharpZipL ...

  6. iOS中使用ZipArchive压缩和解压缩文件-备

    为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用 ...

  7. IO操作之使用zip包压缩和解压缩文件

    转自:http://www.cdtarena.com/java.html​​Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...

  8. Java用ZIP格式压缩和解压缩文件

    转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...

  9. 使用commons-compress操作zip文件(压缩和解压缩)

    http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...

  10. Ubuntu终端文件的压缩和解压缩命令

    在Ubntu的终端中压缩和解压缩是每天几乎要用到的命令,由于linux中各种压缩文件类型较多,所以需要记住几个主要的压缩和解压缩命令: 文件类型 执行动作 命令 .tar 解包 tar xvf Fil ...

随机推荐

  1. 基于surging的木舟平台如何分布式接入设备

    一.概述 上篇文章介绍了木舟通过基于木舟平台浅谈surging 的热点KEY的解决方法,那么此篇文章将介绍基于surging的木舟平台如何分布式接入设备. 木舟 (Kayak) 是什么? 木舟(Kay ...

  2. Vue.js 文本行滚动

    1.前言 文本行滚动组件,效果如图 2.封装思路 封装一个组件,接收一个数组,每个数组元素就是一个段文本 组件使用httpVueLoader进行封装加载 使用css位移,配合过渡效果才展示动画 滚动逻 ...

  3. 解锁 Git Log 更多实用技巧

    目前,在软件开发的协作中,Git 无疑是版本控制的王者. 而其中的 git log 命令,犹如一把强大的历史探寻之剑,能够帮助我们深入洞察项目的演进历程. 本篇将为大家整理解读几个实用的 git Lo ...

  4. MySQL的 安装、配置、卸载

    Mysql的安装配置(基于Centos7) 安装mysql数据库 [root@master ~]# wget https://dev.mysql.com/get/mysql57-community-r ...

  5. java 随机生成字符串 RandomStringUtils

    使用RandomStringUtils,可以选择生成随机字符串,可以是全字母.全数字或自定义生成字符等等... 其最基础的方法如下: public static String random(int c ...

  6. The "https://packagist.phpcomposer.com/packages.json" file could not be down

    composer自身版本太低了,更新下 composer self-update 使用阿里云镜像 composer config -g repo.packagist composer https:// ...

  7. Qt音视频开发38-ffmpeg视频暂停录制的设计

    一.前言 基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不 ...

  8. 多语言越狱很棒!😊MULTILINGUAL JAILBREAK CHALLENGES IN🧜‍♀️LARGE LANGUAGE MODELS

    写这篇的时候第一次认识到了附录内容的重要性(bushi只是这篇读了全部的附录),它可以让你明确文章全部的实验,并且其中包含很多辅助你对正文理解的表格 禁止盗用,侵权必究!!!欢迎大家积极举报

  9. 解决Failed to load module canberra-gtk-module错误

    在Ubuntu环境里,通过./triangulation 1.png 2.png 命令运行高翔的ch7的triangulation程序时报错: Gtk-Message: 09:10:26.571: F ...

  10. 如何通过C#修改Windows操作系统时间

    C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员.用过VC.VB等的朋友可能知道,我们可以调用Win32 ...