C#-Komprimierungs- und Dekomprimierungshilfsklasse

大家讲道理
Freigeben: 2016-11-11 14:53:21
Original
1478 Leute haben es durchsucht

using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Linq;  
using System.Web;  
using ICSharpCode.SharpZipLib.Zip;  
   
namespace GzRMIS.Main.Business  
{  
    public class ZipHelper  
    {  
        /// <summary>  
        /// 存放待压缩的文件的绝对路径  
        /// </summary>  
        private List<string> AbsolutePaths { set; get; }  
        public string errorMsg { set; get; }  
   
        public ZipHelper()  
        {  
            errorMsg = "";  
            AbsolutePaths = new List<string>();  
        }  
        /// <summary>  
        /// 添加压缩文件或文件夹  
        /// </summary>  
        /// <param name="_fileAbsolutePath">文件或文件夹的绝对路径</param>  
        public void AddFile(string _fileAbsolutePath)  
        {  
            AbsolutePaths.Add(_fileAbsolutePath);  
        }  
        /// <summary>  
        /// 压缩文件或者文件夹  
        /// </summary>  
        /// <param name="_depositPath">压缩后文件的存放路径   如C:\\windows\abc.zip</param>  
        ///  <param name="_Level">压缩级别0~9,数字越大压缩率越高,默认为5</param>  
        /// <returns></returns>  
        public bool CompressionZip(string _depositPath,int _Level=5)  
        {  
            bool result = true;  
            FileStream fs = null;  
            try 
            {  
                ZipOutputStream ComStream = new ZipOutputStream(File.Create(_depositPath));  
                ComStream.SetLevel(_Level);      //压缩等级  
                foreach (string path in AbsolutePaths)  
                {  
                    //如果是目录  
                    if (Directory.Exists(path))  
                    {  
                        ZipFloder(path, ComStream, path);  
                    }  
                    else if (File.Exists(path))//如果是文件  
                    {  
                        fs = File.OpenRead(path);  
                        byte[] bts = new byte[fs.Length];  
                        fs.Read(bts, 0, bts.Length);  
                        ZipEntry ze = new ZipEntry(new FileInfo(path).Name);  
                        ComStream.PutNextEntry(ze);             //为压缩文件流提供一个容器  
                        ComStream.Write(bts, 0, bts.Length);  //写入字节  
                    }  
                }  
                ComStream.Finish(); // 结束压缩  
                ComStream.Close();  
            }  
            catch (Exception ex)  
            {  
                if (fs != null)  
                {  
                    fs.Close();  
                }  
                errorMsg = ex.Message;  
                result = false;  
            }  
            return result;  
        }  
        //压缩文件夹  
        private void ZipFloder(string _OfloderPath, ZipOutputStream zos, string _floderPath)  
        {  
            foreach (FileSystemInfo item in new DirectoryInfo(_floderPath).GetFileSystemInfos())  
            {  
                if (Directory.Exists(item.FullName))  
                {  
                    ZipFloder(_OfloderPath, zos, item.FullName);  
                }  
                else if (File.Exists(item.FullName))//如果是文件  
                {  
                    DirectoryInfo ODir = new DirectoryInfo(_OfloderPath);  
                    string fullName2 = new FileInfo(item.FullName).FullName;  
                    string path = ODir.Name + fullName2.Substring(ODir.FullName.Length, fullName2.Length - ODir.FullName.Length);//获取相对目录  
                    FileStream fs = File.OpenRead(fullName2);  
                    byte[] bts = new byte[fs.Length];  
                    fs.Read(bts, 0, bts.Length);  
                    ZipEntry ze = new ZipEntry(path);  
                    zos.PutNextEntry(ze);             //为压缩文件流提供一个容器  
                    zos.Write(bts, 0, bts.Length);  //写入字节  
                }  
            }  
        }  
        /// <summary>  
        /// 解压  
        /// </summary>  
        /// <param name="_depositPath">压缩文件路径</param>  
        /// <param name="_floderPath">解压的路径</param>  
        /// <returns></returns>  
        public bool DeCompressionZip(string _depositPath, string _floderPath)  
        {  
            bool result = true;  
            FileStream fs = null;  
            try 
            {  
                ZipInputStream InpStream = new ZipInputStream(File.OpenRead(_depositPath));  
                ZipEntry ze = InpStream.GetNextEntry();//获取压缩文件中的每一个文件  
                Directory.CreateDirectory(_floderPath);//创建解压文件夹  
                while (ze != null)//如果解压完ze则是null  
                {  
                    if (ze.IsFile)//压缩zipINputStream里面存的都是文件。带文件夹的文件名字是文件夹\\文件名  
                    {  
                        string[] strs = ze.Name.Split(&#39;\\&#39;);//如果文件名中包含’\\‘则表明有文件夹  
                        if (strs.Length > 1)  
                        {  
                            //两层循环用于一层一层创建文件夹  
                            for (int i = 0; i < strs.Length - 1; i++)  
                            {  
                                string floderPath = _floderPath;  
                                for (int j = 0; j < i; j++)  
                                {  
                                    floderPath = floderPath + "\\" + strs[j];  
                                }  
                                floderPath = floderPath + "\\" + strs[i];  
                                Directory.CreateDirectory(floderPath);  
                            }  
                        }  
                        fs = new FileStream(_floderPath + "\\" + ze.Name, FileMode.OpenOrCreate, FileAccess.Write);//创建文件  
                        //循环读取文件到文件流中  
                        while (true)  
                        {  
                            byte[] bts = new byte[1024];  
                            int i = InpStream.Read(bts, 0, bts.Length);  
                            if (i > 0)  
                            {  
                                fs.Write(bts, 0, i);  
                            }  
                            else 
                            {  
                                fs.Flush();  
                                fs.Close();  
                                break;  
                            }  
                        }  
                    }  
                    ze = InpStream.GetNextEntry();  
                }  
            }  
            catch (Exception ex)  
            {  
                if (fs != null)  
                {  
                    fs.Close();  
                }  
                errorMsg = ex.Message;  
                result = false;  
            }  
            return result;  
        }  
   
    }  
}
Nach dem Login kopieren

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!