zoukankan      html  css  js  c++  java
  • 文件压缩/解压缩开源项目SharpZipLib在C#中的使用

    .net2.0,虽然也有一个解压缩的类,但是好像并不怎么受欢迎。不过我们还可以选择别SharpZipLib。
    我从网上找了一些代码,有些做了修改,已经测试可以使用。解压缩操作类:
    using System;  
    using System.Collections.Generic;  
    using System.Web.UI.WebControls;  
    using System.Web;  
    using System.Text;  
    using System.IO;  
    using ICSharpCode.SharpZipLib.Zip;  
    using ICSharpCode.SharpZipLib.Checksums;  


    namespace VeryCodes.Common  
    {  
        public class ZipHelper  
        {  
            ///  
            /// 压缩单个文件  
            ///  
            ///要压缩的文件  
            ///  
            ///压缩后的文件  
            ///  
            ///压缩等级  
            ///  
            ///每次写入大小  
            public static void ZipFile(string fileToZip, string zipedFile, 
                int compressionLevel, int blockSize)  
            {  
                //如果文件没有找到,则报错  
                if (!System.IO.File.Exists(fileToZip))  
                {  
                    throw new System.IO.FileNotFoundException("指定要压缩的文件: " +
                        fileToZip + " 不存在!");  
                }  


                using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))  
                {  
                    using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))  
                    {  
                        using (System.IO.FileStream StreamToZip = 
                            new System.IO.FileStream(fileToZip, System.IO.FileMode.Open,
                                System.IO.FileAccess.Read))  
                        {  
                            string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);  


                            ZipEntry ZipEntry = new ZipEntry(fileName);  
                            ZipStream.PutNextEntry(ZipEntry);  
                            ZipStream.SetLevel(compressionLevel);  


                            byte[] buffer = new byte[blockSize];  
                            int sizeRead = 0;  


                            try 
                            {  
                                do 
                                {  
                                    sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);  
                                    ZipStream.Write(buffer, 0, sizeRead);  
                                }  
                                while (sizeRead > 0);  
                            }  
                            catch (System.Exception ex)  
                            {  
                                throw ex;  
                            }  


                            StreamToZip.Close();  
                        }  


                        ZipStream.Finish();  
                        ZipStream.Close();  
                    }  


                    ZipFile.Close();  
                }  
            }  


            ///  
            /// 压缩单个文件  
            ///  
            ///要进行压缩的文件名  
            ///  
            ///压缩后生成的压缩文件名  
            public static void ZipFile(string fileToZip, string zipedFile)  
            {  
                //如果文件没有找到,则报错  
                if (!File.Exists(fileToZip))  
                {  
                    throw new System.IO.FileNotFoundException("指定要压缩的文件: " + 
                        fileToZip + " 不存在!");  
                }  


                using (FileStream fs = File.OpenRead(fileToZip))  
                {  
                    byte[] buffer = new byte[fs.Length];  


                    fs.Read(buffer, 0, buffer.Length);  
                    fs.Close();  


                    using (FileStream ZipFile = File.Create(zipedFile))  
                    {  
                        using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))  
                        {  
                            string fileName = 
                                fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); 
     
                            ZipEntry ZipEntry = new ZipEntry(fileName);  
                            ZipStream.PutNextEntry(ZipEntry);  
                            ZipStream.SetLevel(5);  


                            ZipStream.Write(buffer, 0, buffer.Length);  
                            ZipStream.Finish();  
                            ZipStream.Close();  
                        }  
                    }  
                }  
            }  


            ///  
            /// 压缩多层目录  
            ///  
            ///压缩目录  
            ///  
            ///压缩文件流  
            ///  
            public static void ZipFileDirectory(string strDirectory, string zipedFile)  
            {  
                using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))  
                {  
                    using (ZipOutputStream s = new ZipOutputStream(ZipFile))  
                    {  
                        ZipSetp(strDirectory, s, "");  
                    }  
                }  
            }  


            ///  
            /// 递归遍历目录  
            ///  
            ///  
            private static void ZipSetp(string strDirectory,
                ZipOutputStream s, string parentPath)  
            {  
                if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)  
                {  
                    strDirectory += Path.DirectorySeparatorChar;  
                }  


                Crc32 crc = new Crc32();  


                string[] filenames = Directory.GetFileSystemEntries(strDirectory);  
                // 遍历所有的文件和目录
                foreach (string file in filenames)  
                {  
                    // 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
                    if (Directory.Exists(file))  
                    {  
                        parentPath += file.Substring(file.LastIndexOf("\\") + 1);  
                        parentPath += "\\";  


                        ZipSetp(file, s, parentPath);  
                    }  
                    else // 否则直接压缩文件  
                    {  
                        //打开压缩文件  
                        using (FileStream fs = File.OpenRead(file))  
                        {  
                            byte[] buffer = new byte[fs.Length];  


                            fs.Read(buffer, 0, buffer.Length);  


                            string fileName = parentPath + file.Substring(file.LastIndexOf("\\") + 1);  


                            ZipEntry entry = new ZipEntry(fileName);  
                            entry.DateTime = DateTime.Now;  
                            entry.Size = fs.Length;  
                            fs.Close(); 
     
                            crc.Reset();  
                            crc.Update(buffer);  


                            entry.Crc = crc.Value;  


                            s.PutNextEntry(entry);  
                            s.Write(buffer, 0, buffer.Length);  
                        }  
                    }  
                }  
            }  


            ///  
            /// 解压缩一个 zip 文件。  
            ///  
            ///要解压的 zip 文件。  
            ///  
            ///zip 文件的解压目录。  
            ///  
            ///zip 文件的密码。  
            ///  
            ///是否覆盖已存在的文件。  
            public static void UnZip(string zipedFile, 
                string strDirectory, string password, bool overWrite)  
            {  
                if (strDirectory == "")  
                    strDirectory = Directory.GetCurrentDirectory();  


                if (!strDirectory.EndsWith("\\"))  
                    strDirectory = strDirectory + "\\";  


                using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))  
                {  
                    s.Password = password;  


                    ZipEntry theEntry;  


                    while ((theEntry = s.GetNextEntry()) != null)  
                    {  
                        string directoryName = "";  
                        string pathToZip = "";  


                        pathToZip = theEntry.Name;  


                        if (pathToZip != "")  
                            directoryName = Path.GetDirectoryName(pathToZip) + "\\";  


                        string fileName = Path.GetFileName(pathToZip);  
                        Directory.CreateDirectory(strDirectory + directoryName);  


                        if (fileName != "")  
                        {  
                            if ((File.Exists(strDirectory + directoryName + fileName) && 
                                overWrite) || (!File.Exists(strDirectory + 
                                directoryName + fileName)))  
                            {  
                                using (FileStream streamWriter = 
                                    File.Create(strDirectory + directoryName + fileName))  
                                {  
                                    int size = 2048;  
                                    byte[] data = new byte[2048];  


                                    while (true)  
                                    {  
                                        size = s.Read(data, 0, data.Length);  
                                        if (size > 0)  
                                            streamWriter.Write(data, 0, size);  
                                        else 
                                            break;  
                                    }  


                                    streamWriter.Close();  
                                }  
                            }  
                        }  
                    }  


                    s.Close();  
                }  
            }  
        }  





    测试:
       protected void Button1_Click(object sender, EventArgs e)  
       {  
           ZipHelper.ZipFile(@"E:\02.gif", @"E:\02.zip");  
       }  


       protected void Button3_Click(object sender, EventArgs e)  
       {  
           ZipHelper.ZipFile(@"E:\asp.net中文手册.chm", @"E:\asp.net中文手册.zip", 5, 1024);  
       }  


       protected void Button2_Click(object sender, EventArgs e)  
       {  
           ZipHelper.UnZip("E:\\页面窗口拖动.zip", "E:\\页面窗口拖动2\\", "", true);  
       }  


       protected void Button4_Click(object sender, EventArgs e)  
       {  
           ZipHelper.ZipFileDirectory("E:\\页面窗口拖动\\", "E:\\页面窗口拖动.zip");  
       } 

    在解压缩的时候会出现一个问题:size mismatch: XXXXXXX有个办法,我还没仔细看,但是有效:打开SharpZipLib源代码,你找到ZIP文件夹下的,ZipInputStream.cs文件然后找到这段
     
    if ((flags & 8) == 0 && (inf.TotalIn != csize || inf.TotalOut != size)) 
    {  
         throw new ZipException("Size mismatch: " + csize + ";" + 
              size + " <-> " + inf.TotalIn + ";" + inf.TotalOut);  
    } 把如上代码注释掉,然后编译,从新引入DLL到项目中就可以了.
  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2051519.html
Copyright © 2011-2022 走看看