• 【转】【C#】ZIP、RAR 压缩与解压缩


    
    压缩文件夹
    
    源码如下
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    
    using System.IO;
    
    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.GZip;
    
    ///
    
    
    /// ZipFloClass 的摘要说明
    ///
    
    public class ZipFloClass
    {
        public void ZipFile(string strFile, string strZip)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
                strFile += Path.DirectorySeparatorChar;
            ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            zip(strFile, s, strFile);
            s.Finish();
            s.Close();
        }
    
        private void zip(string strFile, ZipOutputStream s, string staticFile)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;
            Crc32 crc = new Crc32();
            string[] filenames = Directory.GetFileSystemEntries(strFile);
            foreach (string file in filenames)
            {
    
                if (Directory.Exists(file))
                {
                    zip(file, s, staticFile);
                }
    
                else // 否则直接压缩文件
                {
                    //打开压缩文件
                    FileStream fs = File.OpenRead(file);
    
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    string tempfile = file.Substring(staticFile.LastIndexOf("\") + 1);
                    ZipEntry entry = new ZipEntry(tempfile);
    
                    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);
                }
            }
        }
    
    }
    
    解压文件夹
    
    using System;
    using System.Data;
    using System.Web;
    using System.Text;
    using System.Collections;
    using System.IO;
    using System.Diagnostics;
    using System.Runtime.Serialization.Formatters.Binary;
    
    using ICSharpCode.SharpZipLib.BZip2;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Zip.Compression;
    using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
    using ICSharpCode.SharpZipLib.GZip;
    using ICSharpCode.SharpZipLib.Checksums;
    
    ///
    
    
    /// UnZipFloClass 的摘要说明
    ///
    
    public class UnZipFloClass
    {
        public string unZipFile(string TargetFile, string fileDir)
        {
            string rootFile = " ";
            try
            {
                //读取压缩文件(zip文件),准备解压缩
                ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
                ZipEntry theEntry;
                string path = fileDir;                   
                //解压出来的文件保存的路径
    
                string rootDir = " ";                        
                //根目录下的第一个子文件夹的名称
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    rootDir = Path.GetDirectoryName(theEntry.Name);                          
                    //得到根目录下的第一级子文件夹的名称
                    if (rootDir.IndexOf("\") >= 0)
                    {
                        rootDir = rootDir.Substring(0, rootDir.IndexOf("\") + 1);
                    }
                    string dir = Path.GetDirectoryName(theEntry.Name);                    
                    //根目录下的第一级子文件夹的下的文件夹的名称
                    string fileName = Path.GetFileName(theEntry.Name);                    
                    //根目录下的文件名称
                    if (dir != " " )                                                        
                        //创建根目录下的子文件夹,不限制级别
                    {
                        if (!Directory.Exists(fileDir + "\" + dir))
                        {
                            path = fileDir + "\" + dir;                                                
                            //在指定的路径创建文件夹
                            Directory.CreateDirectory(path);
                        }
                    }
                    else if (dir == " " && fileName != "")                                              
                        //根目录下的文件
                    {
                        path = fileDir;
                        rootFile = fileName;
                    }
                    else if (dir != " " && fileName != "")                                              
                        //根目录下的第一级子文件夹下的文件
                    {
                        if (dir.IndexOf("\") > 0)                                                            
                            //指定文件保存的路径
                        {
                            path = fileDir + "\" + dir;
                        }
                    }
    
                    if (dir == rootDir)                                                                                  
                        //判断是不是需要保存在根目录下的文件
                    {
                        path = fileDir + "\" + rootDir;
                    }
    
                    //以下为解压缩zip文件的基本步骤
                    //基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
                    if (fileName != String.Empty)
                    {
                        FileStream streamWriter = File.Create(path + "\" + 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();
    
                return rootFile;
            }
            catch (Exception ex)
            {
                return "1; " + ex.Message;
            }
        }   
    }

    调用:

    /// <summary>
            /// 压缩
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                string[] FileProperties = new string[2];
                FileProperties[0] = "D:\Debug\";//待压缩文件目录
                //Debug2=>目录必须存在(可以改进程序)
                FileProperties[1] = "D:\Debug2\a.zip";  //压缩后的目标文件
                ZipFloClass Zc = new ZipFloClass();
                Zc.ZipFile(FileProperties[0], FileProperties[1]);
            }
    
            /// <summary>
            /// 解压
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button2_Click(object sender, EventArgs e)
            {
                string[] FileProperties = new string[2];
                FileProperties[0] = "D:\Debug2\a.zip";//待解压的文件
                //=>Debug3目录可以不用存在
                FileProperties[1] = "D:\Debug3\";//解压后放置的目标目录
                UnZipFloClass UnZc = new UnZipFloClass();
                UnZc.unZipFile(FileProperties[0], FileProperties[1]);
            }
     ICSharpCode.SharpZipLib.dll下载 

    原文地址:http://www.cnblogs.com/zfanlong1314/p/4202695.html

    PS.补充RAR解压 2018-8-18
    SharpCompress的C#框架被开源,您可以在搜索引擎中找到SharpCompress框架的开源代码,它支持:rar 7zip, zip, tar, tzip和bzip2格式的压缩和解压,下面的示例直接从rar格式文件读取并解压文件。
    using (Stream stream = File.OpenRead(@"C:Codesharpcompress.rar"))
                {
                    var reader = ReaderFactory.Open(stream);
                    while (reader.MoveToNextEntry())
                    {
                        if (!reader.Entry.IsDirectory)
                        {
                            reader.WriteEntryToDirectory(@"C:	emp");
                        }
                    }
                }


  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/mqxs/p/7450107.html
Copyright © 2020-2023  润新知