zoukankan      html  css  js  c++  java
  • ZipUtility 解压

    using System;
    
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.Win32;
    using System.Diagnostics;
    using System.IO;
    using ICSharpCode.SharpZipLib.Zip;
    using SwireBev.Mobile.Utility;
    
    namespace MobileTest
    {
        public class ZipUtility
        {
            public delegate void ThreadStop(int zipType, int fileIndex, string status, string title);                                //线程操作完成
            public event ThreadStop threadStop;
    
            /// <summary>
            /// 写入ZIP
            /// </summary>
            /// <param name="zos"></param>
            /// <param name="topDirName"></param>
            /// <param name="pathStr"></param>
            /// <param name="index"></param>
            /// <param name="absolute"></param>
            private void addZipWrite(ZipOutputStream zos, string topDirName, string pathStr, int index, string absolute)
            {
                string strEntryName = pathStr;
                if (!topDirName.Equals(""))
                {
                    strEntryName = pathStr.Replace(topDirName, "");
                }
                try
                {
                    FileStream fs = File.OpenRead(pathStr);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    ZipEntry entry = new ZipEntry(Path.GetFileName(strEntryName));
                    if (absolute.Equals("0"))
                    {
                        entry = new ZipEntry(strEntryName);
                    }
                    zos.PutNextEntry(entry);
                    zos.Write(buffer, 0, buffer.Length);
                    fs.Close();
                    threadStop(0, index, "OK", Path.GetFileName(strEntryName));
                }
                catch
                {
                    threadStop(0, index, "Error", Path.GetFileName(strEntryName));
                }
            }
    
            /// <summary>
            /// 回调
            /// </summary>
            /// <param name="zos"></param>
            /// <param name="topDirName"></param>
            /// <param name="pathStr"></param>
            /// <param name="absolute"></param>
            private void addZipEntry(ZipOutputStream zos, string topDirName, string pathStr, string absolute)
            {
                if (!Path.GetFileName(pathStr).Equals(""))
                {
                    addZipWrite(zos, topDirName, pathStr, 0, absolute);
                }
                else
                {
                    DirectoryInfo di = new DirectoryInfo(pathStr);
                    foreach (DirectoryInfo item in di.GetDirectories())
                    {
                        addZipEntry(zos, topDirName, item.FullName, absolute);
                    }
                    int index = 0;
                    foreach (FileInfo item in di.GetFiles())
                    {
                        addZipWrite(zos, topDirName, item.FullName, index++, absolute);
                    }
                }
            }
    
    
            
            /// <summary>  
            /// 压缩指定文件生成ZIP文件  
            /// </summary>  
            /// <param name="topDirName">顶层文件夹名称</param>  
            /// <param name="fileNamesToZip">待压缩文件列表</param>  
            /// <param name="ZipedFileName">ZIP文件</param>  
            /// <param name="CompressionLevel">压缩比</param>  
            /// <param name="password">密码</param>  
            /// <param name="comment">压缩文件注释文字</param>  
            public void ZipFile
                (
                string topDirName,  //顶层文件夹名称 \Storage Card\PDADataExchange\send\xml\
                string[][] fileNamesToZip,  //待压缩文件列表  new string[2]{"version.xml","0")  0 相对 包含文件夹 1 绝对 不包含文件夹
                string zipFileName,   //ZIP文件  \Storage Card\PDADataExchange\send\zip\version.zip
                int CompressionLevel,    //压缩比  7
                string password,    //密码   ""
                string comment   //压缩文件注释文字  ""
                )
            {
                ZipOutputStream zos = new ZipOutputStream(System.IO.File.Open(zipFileName, FileMode.Create));
    
                if (password != null && password.Length > 0)
                    zos.Password = password;
    
                if (comment != null && comment.Length > 0)
                    zos.SetComment(comment);
    
                zos.SetLevel(CompressionLevel); // 0 - means store only to 9 - means best compression  
                if (fileNamesToZip.Length > 0)
                {
                    foreach (string[] file in fileNamesToZip)
                    {
                        string filePath = topDirName + file[0];
                        addZipEntry(zos, topDirName, filePath, file[1]);
                    }
                }
                else
                {
                    string filePath = topDirName;
                    addZipEntry(zos, topDirName, filePath, "0");
                }
                zos.Finish();
                zos.Close();
            }
    
            /// <summary>  
            /// 解压缩ZIP文件到指定文件夹  
            /// </summary>  
            /// <param name="zipfileName">ZIP文件</param>  
            /// <param name="UnZipDir">解压文件夹</param>  
            /// <param name="password">压缩文件密码</param>  
            public void UnZipFile(string zipFileName, string UnZipDir, string password)
            {
                ZipInputStream s = new ZipInputStream(File.OpenRead(zipFileName));
                if (password != null && password.Length > 0)
                    s.Password = password;
                try
                {
                    ZipEntry theEntry;
                    int index = 0;
                    while ((theEntry = s.GetNextEntry()) != null)
                    {
                        string directoryName = Path.GetDirectoryName(UnZipDir);
                        string pathname = Path.GetDirectoryName(theEntry.Name);
                        string fileName = Path.GetFileName(theEntry.Name);
                        string file = "";
                        try
                        {
                            //生成解压目录   
                            pathname = pathname.Replace(":", "$");//处理压缩时带有盘符的问题  
                            directoryName = directoryName + "\\" + pathname;
                            Directory.CreateDirectory(directoryName);
                            file = directoryName + "\\" + fileName;
                            if (fileName != String.Empty)
                            {
                                //解压文件到指定的目录  
                                FileStream streamWriter = File.Create(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();
                            }
                            if (File.Exists(file))
                            {
                                if (threadStop != null)
                                {
                                    if (threadStop != null)
                                    {
                                        if (!Path.GetFileName(zipFileName).Equals(Path.GetFileName(file)))
                                        {
                                            threadStop(1, index++, "OK", Path.GetFileName(file));
                                        }
                                    }
                                }
                            }
                            
                        }
                        catch
                        {
                            if (File.Exists(file))
                            {
                                if (threadStop != null)
                                {
                                    if (threadStop != null)
                                    {
                                        if (!Path.GetFileName(zipFileName).Equals(Path.GetFileName(file)))
                                        {
                                            threadStop(1, index++, "Error", Path.GetFileName(file));
                                        }
                                    }
                                }
                            }
                        }
                        
                    }
                    s.Close();
                }
                catch (Exception eu)
                {
                    throw eu;
                }
                finally
                {
                    s.Close();
                }
    
            }
        }
    }
  • 相关阅读:
    ASP.NET:关于.net中的runat
    javascript/dom:原生的JS写选项卡方法
    深入学习javascript:cookie
    javascript练习:8综合练习
    javascript/dom:对样式进行操作
    C#:form的窗体属性formborderstyle设置为none后就不能移动了
    javascript/dom:获取CSS值/getComputedStyle方法
    【玩转.Net MF – 04】远程屏幕截图
    .Net Micro Framework V4.1 beta 发布
    RFID技术在.Net Micro Framework中的应用
  • 原文地址:https://www.cnblogs.com/xsmhero/p/2882825.html
Copyright © 2011-2022 走看看