windows mobile 上文件压缩与解压缩(使用ICSharpCode.SharpZipLib.Zip)

using System;

using System.Linq;

using System.Collections.Generic;

using System.Text;

 

using ICSharpCode.SharpZipLib.Zip;//ZipOutputStream

using System.IO;//FileMode

 

 

namespace quietwalk.ZipUnZip

{

    public class SharpZipHelper

    {

        /// <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 static void ZipFile  

            (

            string topDirName,  //顶层文件夹名称 \Storage Card\PDADataExchange\send\xml\

            string[] fileNamesToZip,  //待压缩文件列表  version.xml

            string ZipedFileName,   //ZIP文件  \Storage Card\PDADataExchange\send\zip\version.zip

            int CompressionLevel,    //压缩比  7

            string password,    //密码   ""

            string comment   //压缩文件注释文字  ""

            )  

        {  

            ZipOutputStream s = new ZipOutputStream(System.IO.File.Open(ZipedFileName, FileMode.Create)); 

 

            if(password != null && password.Length > 0)  

                s.Password = password;  

 

            if(comment != null && comment.Length >0)  

                s.SetComment(comment);  

 

            s.SetLevel(CompressionLevel); // 0 - means store only to 9 - means best compression  

 

            foreach (string file in fileNamesToZip)  

            {  

                FileStream fs = File.OpenRead(topDirName + file);    //打开待压缩文件  

                byte[] buffer = new byte[fs.Length];  

                fs.Read(buffer, 0, buffer.Length);      //读取文件流  

                ZipEntry entry = new ZipEntry(file);    //新建实例  

 

                entry.DateTime = DateTime.Now;  

 

                entry.Size = fs.Length;  

                fs.Close();  

 

                s.PutNextEntry(entry);  

                s.Write(buffer, 0, buffer.Length);  

            }  

            s.Finish();  

            s.Close();  

        }  

 

        /// <summary>  

        /// 解压缩ZIP文件到指定文件夹  

        /// </summary>  

        /// <param name="zipfileName">ZIP文件</param>  

        /// <param name="UnZipDir">解压文件夹</param>  

        /// <param name="password">压缩文件密码</param>  

        public static void UnZipFile(string zipfileName, string UnZipDir, string password)  

        {

 

            //zipfileName=@"\Storage Card\PDADataExchange\receive\zip\test.zip";

            //UnZipDir= @"\Storage Card\PDADataExchange\receive\xml\";

            //password="";

 

            ZipInputStream s = new ZipInputStream(File.OpenRead(zipfileName));  

            if (password != null && password.Length > 0)  

                s.Password = password;  

            try 

            {  

                ZipEntry theEntry;  

                while ((theEntry = s.GetNextEntry()) != null)  

                {  

                    string directoryName = Path.GetDirectoryName(UnZipDir);  

                    string pathname = Path.GetDirectoryName(theEntry.Name);  

                    string fileName = Path.GetFileName(theEntry.Name);  

 

                    //生成解压目录   

                    pathname = pathname.Replace(":", "$");//处理压缩时带有盘符的问题  

                    directoryName = directoryName + "\\" + pathname;  

                    Directory.CreateDirectory(directoryName);  

 

                    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();  

                    }  

                }  

                s.Close();  

            }  

            catch (Exception eu)   

            {  

                throw eu;  

            }  

            finally 

            {  

                s.Close();  

            }  

 

        }  

    }  

}

 

 

posted @ 2010-10-11 23:01  quietwalk  阅读(1665)  评论(1编辑  收藏  举报