企业联盟_商家联盟
企业 公司 行业 商机 求购 供应 资讯 展会 招商
商家 店铺 目录 优惠 赠券 积分 人才 求职 招聘
服装 鞋业 陶瓷 石材 茶业 玩具 手机
培训 房产 旅游 二手 人才 汽车 家政
广东 浙江 江苏 上海 北京 山东 河北 福建 河南 辽宁 四川 湖北 天津 安徽 湖南 陕西 江西 山西 重庆 广西 黑龙江 云南 吉林 内蒙古 贵州 甘肃 新疆 海南 宁夏 青海
您当前的位置: 首页 » 编程开发 »在C#中利用SharpZipLib进行文件的压缩和解压缩

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

加入时间: 2007-12-21 11:45:56       来源: 网络     企业商家联盟1so.net.cn收集整理

我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为ZipClass和UnZipClass。其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享,让首次接触压缩和解压缩的朋友可以少走些弯路。下面就来解释如何在C#里用http://www.icsharpcode.net下载的SharpZipLib进行文件的压缩和解压缩。

 
首先需要在项目里引用sharpziplib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:
 
///
/// 压缩文件
///
 
using System;
using System.IO;
 
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
 
namespace Compression
{
    publicclass ZipClass
    {
 
        publicvoid ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize)
        {
            //如果文件没有找到,则报错
            if (! System.IO.File.Exists(FileToZip))
            {
                thrownew System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
            }
 
            system.io.filestream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
            System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
            ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
            ZipEntry ZipEntry = new ZipEntry("ZippedFile");
            ZipStream.PutNextEntry(ZipEntry);
            ZipStream.SetLevel(CompressionLevel);
            byte[] buffer = newbyte[BlockSize];
            System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
            ZipStream.Write(buffer,0,size);
            try
            {
                while (size < StreamToZip.Length)
                {
                    int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
                    ZipStream.Write(buffer,0,sizeRead);
                    size += sizeRead;
                }
            }
            catch(System.Exception ex)
            {
                throw ex;
            }
            ZipStream.Finish();
            ZipStream.Close();
            StreamToZip.Close();
        }
 
        publicvoid ZipFileMain(string[] args)
        {
            string[] filenames = Directory.GetFiles(args[0]);
 
            crc32 crc = new Crc32();
            ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));
 
            s.setlevel(6); // 0 - store only to 9 - means best compression
 
            foreach (string file in filenames)
            {
                //打开压缩文件
                FileStream fs = File.OpenRead(file);
 
                byte[] buffer = newbyte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                ZipEntry entry = new ZipEntry(file);
 
                entry.datetime = DateTime.Now;
 
                // set Size and the crc, because the information
                // about the size and crc should be stored in the header
                // if it is not set it is automatically written in the footer.
                // (in this case size == crc == -1 in the header)
                // Some ZIP programs have problems with zip files that don't store
                // the size and crc in the header.
                entry.Size = fs.Length;
                fs.Close();
 
                crc.reset();
                crc.Update(buffer);
 
                entry.crc = crc.Value;
 
                s.putnextentry(entry);
 
                s.write(buffer, 0, buffer.Length);
 
            }
 
            s.finish();
            s.Close();
        }
    }
}
 
现在再来看看解压文件类的源码
 
///
/// 解压文件
///
 
using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;
 
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;
 
namespace DeCompression
{
    publicclass UnZipClass
    {
        publicvoid UnZip(string[] args)
        {
            ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
 
            zipentry theEntry;
            while ((theEntry = s.GetNextEntry()) != null)
            {
 
                string directoryName = Path.GetDirectoryName(args[1]);
                string fileName = Path.GetFileName(theEntry.Name);
 
                //生成解压目录
                Directory.CreateDirectory(directoryName);
 
                if (fileName != String.Empty)
                {
                    //解压文件到指定的目录
                    FileStream streamWriter = File.Create(args[1]+theEntry.Name);
 
                    int size = 2048;
                    byte[] data = newbyte[2048];
                    while (true)
                    {
                        size = s.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
 
                    streamwriter.close();
                }
            }
            s.Close();
        }
    }
}
 
有了压缩和解压缩的类以后,就要在窗体里调用了。怎么?是新手,不会调用?ok,接着往下看如何在窗体里调用。
 
首先在窗体里放置两个命令按钮(不要告诉我你不会放啊~),然后编写以下源码
 
///
/// 调用源码
///
 
privatevoid button2_Click_1(object sender, System.EventArgs e)
{
    string []FileProperties=newstring[2];
    FileProperties[0]="C:\\unzipped\\";//待压缩文件目录
    FileProperties[1]="C:\\zip\\a.zip"; //压缩后的目标文件
    ZipClass Zc=new ZipClass();
    Zc.ZipFileMain(FileProperties);
}
 
private void button2_Click(object sender, System.EventArgs e)
{
    string []FileProperties=new string[2];
    FileProperties[0]="C:\\zip\\test.zip";//待解压的文件
    FileProperties[1]="C:\\unzipped\\";//解压后放置的目标目录
    UnZipClass UnZc=new UnZipClass();
    UnZc.UnZip(FileProperties);
}
 
好了,到此为止,如何压缩和解压缩的类都已经完成了,需要的朋友直接拿走调吧。
 
 
媒体活动
News 获取URL参数
News “菜鸟”租房的四大注意点
News 租房的理财之道
News 租房六大注意事项
News 节日短租房升温
News 2012中国吉林龙湾野生杜鹃花卉旅游节开幕
News 富越·香溪母亲节主题花艺沙龙将于本周六举行
News 温馨五月花 感恩母爱——建发领第母亲节花艺DIY
News 当安全的房客 维护自己的利益
News 大胆交朋友 小心租房子
媒体活动
News 获取URL参数
News “菜鸟”租房的四大注意点
News 租房的理财之道
News 租房六大注意事项
News 节日短租房升温
News 2012中国吉林龙湾野生杜鹃花卉旅游节开幕
News 富越·香溪母亲节主题花艺沙龙将于本周六举行
News 温馨五月花 感恩母爱——建发领第母亲节花艺DIY
News 当安全的房客 维护自己的利益
News 大胆交朋友 小心租房子
最新资讯
News 获取URL参数
News “菜鸟”租房的四大注意点
News 租房的理财之道
News 租房六大注意事项
News 节日短租房升温
News 2012中国吉林龙湾野生杜鹃花卉旅游节开幕
News 富越·香溪母亲节主题花艺沙龙将于本周六举行
News 温馨五月花 感恩母爱——建发领第母亲节花艺DIY
News 当安全的房客 维护自己的利益
News 大胆交朋友 小心租房子
服务热线:0595-22657303  18805955455 咨询热线:0595-22657303(传真)
Copyright © 1so.net.cn  All rights reserved   京ICP备08001658号
认证证书
版权所有©企业商家联盟
企业联盟特别提示:本站企业信息由相关企业自行提供,其真实性本站未证实,信息仅供参考。请谨慎采用