.net中壓縮和解壓縮的處理

jopen 10年前發布 | 29K 次閱讀 壓縮 .NET開發

1.利用.net自帶的壓縮和解壓縮方法GZip

參考代碼如下:

//========================================================================
    //  類名: CommonCompress     /// <summary>     /// 用于對文件和字符串進行壓縮
    /// </summary>     /// <remarks>     /// 用于對文件和字符串進行壓縮
    /// </remarks>     /=======================================================================
    變更記錄
    序號   更新日期  開發者   變更內容
    0001   2008/07/22  張          新建
    =======================================================================/     public class CommonCompress
    {
        /// <summary>         /// 壓縮字符串
        /// </summary>         /// <param name="strUncompressed">未壓縮的字符串</param>         /// <returns>壓縮的字符串</returns>         public static string StringCompress(string strUncompressed)
        {
            byte[] bytData = System.Text.Encoding.Unicode.GetBytes(strUncompressed);
            MemoryStream ms = new MemoryStream();
            Stream s = new GZipStream(ms, CompressionMode.Compress);
            s.Write(bytData, 0, bytData.Length);
            s.Close();
            byte[] dataCompressed = (byte[])ms.ToArray();
            return System.Convert.ToBase64String(dataCompressed, 0, dataCompressed.Length);
        }

    /// <summary>         /// 解壓縮字符串
    /// </summary>         /// <param name="strCompressed">壓縮的字符串</param>         /// <returns>未壓縮的字符串</returns>         public static string StringDeCompress(string strCompressed)
    {
        System.Text.StringBuilder strUncompressed = new System.Text.StringBuilder();
        int totalLength = 0;
        byte[] bInput = System.Convert.FromBase64String(strCompressed); ;
        byte[] dataWrite = new byte[4096];
        Stream s = new GZipStream(new MemoryStream(bInput), CompressionMode.Decompress);
        while (true)
        {
            int size = s.Read(dataWrite, 0, dataWrite.Length);
            if (size > 0)
            {
                totalLength += size;
                strUncompressed.Append(System.Text.Encoding.Unicode.GetString(dataWrite, 0, size));
            }
            else                 {
                break;
            }
        }
        s.Close();
        return strUncompressed.ToString();
    }

    /// <summary>         /// 壓縮文件
    /// </summary>         /// <param name="iFile">壓縮前文件路徑</param>         /// <param name="oFile">壓縮后文件路徑</param>         public static void CompressFile(string iFile, string oFile)
    {
        //判斷文件是否存在             if (File.Exists(iFile) == false)
        {
            throw new FileNotFoundException("文件未找到!");
        }
        //創建文件流             byte[] buffer = null;
        FileStream iStream = null;
        FileStream oStream = null;
        GZipStream cStream = null;
        try             {
            //把文件寫進數組                 iStream = new FileStream(iFile, FileMode.Open, FileAccess.Read, FileShare.Read);
            buffer = new byte[iStream.Length];
            int num = iStream.Read(buffer, 0, buffer.Length);
            if (num != buffer.Length)
            {
                throw new ApplicationException("壓縮文件異常!");
            }
            //創建文件輸出流并輸出                 oStream = new FileStream(oFile, FileMode.OpenOrCreate, FileAccess.Write);
            cStream = new GZipStream(oStream, CompressionMode.Compress, true);
            cStream.Write(buffer, 0, buffer.Length);
        }
        finally             {
            //關閉流對象                 if (iStream != null) iStream.Close();
            if (cStream != null) cStream.Close();
            if (oStream != null) oStream.Close();
        }
    }

    /// <summary>         /// 解壓縮文件
    /// </summary>         /// <param name="iFile">壓縮前文件路徑</param>         /// <param name="oFile">壓縮后文件路徑</param>         public static void DecompressFile(string iFile, string oFile)
    {
        //判斷文件是否存在             if (File.Exists(iFile) == false)
        {
            throw new FileNotFoundException("文件未找到!");
        }
        //創建文件流             FileStream iStream = null;
        FileStream oStream = null;
        GZipStream dStream = null;
        byte[] qBuffer = new byte[4];
        try             {
            //把壓縮文件寫入數組                 iStream = new FileStream(iFile, FileMode.Open);
            dStream = new GZipStream(iStream, CompressionMode.Decompress, true);
            int position = (int)iStream.Length - 4;
            iStream.Position = position;
            iStream.Read(qBuffer, 0, 4);
            iStream.Position = 0;
            int num = BitConverter.ToInt32(qBuffer, 0);
            byte[] buffer = new byte[num + 100];
            int offset = 0, total = 0;
            while (true)
            {
                int bytesRead = dStream.Read(buffer, offset, 100);
                if (bytesRead == 0) break;
                offset += bytesRead;
                total += bytesRead;
            }
            //創建輸出流并輸出                 oStream = new FileStream(oFile, FileMode.Create);
            oStream.Write(buffer, 0, total);
            oStream.Flush();
        }
        finally             {
            //關閉流對象                 if (iStream != null) iStream.Close();
            if (dStream != null) dStream.Close();
            if (oStream != null) oStream.Close();
        }
    }
}</pre> <h4 style="padding-bottom:0px;line-height:25px;margin:0px;padding-left:0px;padding-right:0px;font-family:verdana,Arial,Helvetica,sans-serif;font-size:14px;padding-top:0px;">2.利用ICSharpCode的壓縮和解壓縮方法,需引用ICSharpCode.SharpZipLib.dll,這個類庫是開源的,源碼地址<a style="border-bottom:#333333 1px dotted;padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#000000;text-decoration:none;padding-top:0px;" href="/misc/goto?guid=4959618254792586146" target="_blank">http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx</a></h4>

參考代碼如下:

using System;using System.Collections.Generic; using System.IO;using ICSharpCode.SharpZipLib.Zip;using ICSharpCode.SharpZipLib.Checksums;namespace ZYBNET.FW.Utility.CommonMethod
{
    //========================================================================
    //  類名: ZipHelper     /// <summary>     /// 用于對文件和字符串進行壓縮
    /// </summary>     /// <remarks>     /// 用于對文件和字符串進行壓縮
    /// </remarks>     /=======================================================================
    變更記錄
    序號   更新日期  開發者   變更內容
    0001   2008/07/22  張          新建
    =======================================================================/     public class ZipHelper
    {

    #region 壓縮文件夾,支持遞歸
    /// <summary>         /// 壓縮文件夾
    /// </summary>         /// <param name="dir">待壓縮的文件夾</param>         /// <param name="targetFileName">壓縮后文件路徑(包括文件名)</param>         /// <param name="recursive">是否遞歸壓縮</param>         /// <returns></returns>         public static bool Compress(string dir, string targetFileName, bool recursive)
    {
        //如果已經存在目標文件,詢問用戶是否覆蓋             if (File.Exists(targetFileName))
        {
            throw new Exception("同名文件已經存在!");
        }
        string[] ars = new string[2];
        if (recursive == false)
        {
            ars[0] = dir;
            ars[1] = targetFileName;
            return ZipFileDictory(ars);
        }

        FileStream zipFile;
        ZipOutputStream zipStream;

        //打開壓縮文件流             zipFile = File.Create(targetFileName);
        zipStream = new ZipOutputStream(zipFile);

        if (dir != String.Empty)
        {
            CompressFolder(dir, zipStream, dir);
        }

        //關閉壓縮文件流             zipStream.Finish();
        zipStream.Close();

        if (File.Exists(targetFileName))
            return true;
        else                 return false;
    }

    /// <summary>         /// 壓縮目錄
    /// </summary>         /// <param name="args">數組(數組[0]: 要壓縮的目錄; 數組[1]: 壓縮的文件名)</param>         public static bool ZipFileDictory(string[] args)
    {
        ZipOutputStream zStream = null;
        try             {
            string[] filenames = Directory.GetFiles(args[0]);
            Crc32 crc = new Crc32();
            zStream = new ZipOutputStream(File.Create(args[1]));
            zStream.SetLevel(6);
            //循環壓縮文件夾中的文件                 foreach (string file in filenames)
            {
                //打開壓縮文件                     FileStream fs = File.OpenRead(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();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc = crc.Value;
                zStream.PutNextEntry(entry);
                zStream.Write(buffer, 0, buffer.Length);
            }
        }
        catch             {
            throw;
        }
        finally             {
            zStream.Finish();
            zStream.Close();
        }
        return true;
    }

    /// <summary>         /// 壓縮某個子文件夾
    /// </summary>         /// <param name="basePath">待壓縮路徑</param>         /// <param name="zips">壓縮文件流</param>         /// <param name="zipfolername">待壓縮根路徑</param>     
    private static void CompressFolder(string basePath, ZipOutputStream zips, string zipfolername)
    {
        if (File.Exists(basePath))
        {
            AddFile(basePath, zips, zipfolername);
            return;
        }
        string[] names = Directory.GetFiles(basePath);
        foreach (string fileName in names)
        {
            AddFile(fileName, zips, zipfolername);
        }

        names = Directory.GetDirectories(basePath);
        foreach (string folderName in names)
        {
            CompressFolder(folderName, zips, zipfolername);
        }

    }

    /// <summary>         /// 壓縮某個子文件
    /// </summary>         /// <param name="fileName">待壓縮文件</param>         /// <param name="zips">壓縮流</param>         /// <param name="zipfolername">待壓縮根路徑</param>         private static void AddFile(string fileName, ZipOutputStream zips, string zipfolername)
    {
        if (File.Exists(fileName))
        {
            CreateZipFile(fileName, zips, zipfolername);
        }
    }

    /// <summary>         /// 壓縮單獨文件
    /// </summary>         /// <param name="FileToZip">待壓縮文件</param>         /// <param name="zips">壓縮流</param>         /// <param name="zipfolername">待壓縮根路徑</param>         private static void CreateZipFile(string FileToZip, ZipOutputStream zips, string zipfolername)
    {
        try             {
            FileStream StreamToZip = new FileStream(FileToZip, FileMode.Open, FileAccess.Read);
            string temp = FileToZip;
            string temp1 = zipfolername;
            if (temp1.Length > 0)
            {
                temp = temp.Replace(zipfolername + "\\", "");
            }
            ZipEntry ZipEn = new ZipEntry(temp);

            zips.PutNextEntry(ZipEn);
            byte[] buffer = new byte[16384];
            System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length);
            zips.Write(buffer, 0, size);
            try                 {
                while (size < StreamToZip.Length)
                {
                    int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
                    zips.Write(buffer, 0, sizeRead);
                    size += sizeRead;
                }
            }
            catch (System.Exception ex)
            {
                throw ex;
            }

            StreamToZip.Close();
        }
        catch             {
            throw;
        }
    }
    #endregion         #region 解壓縮
    /// <summary>   
    /// 功能:解壓zip格式的文件。   
    /// </summary>   
    /// <param name="zipFilePath">壓縮文件路徑</param>   
    /// <param name="unZipDir">解壓文件存放路徑,為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾</param>   
    /// <returns>解壓是否成功</returns>   
    public static void UnZipFile(string zipFilePath, string unZipDir)
    {

        if (zipFilePath == string.Empty)
        {
            throw new Exception("壓縮文件不能為空!");
        }
        if (!File.Exists(zipFilePath))
        {
            throw new Exception("壓縮文件不存在!");
        }
        //解壓文件夾為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾                if (unZipDir == string.Empty)
            unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
        if (!unZipDir.EndsWith("http://"))
            unZipDir += "http://";
        if (!Directory.Exists(unZipDir))
            Directory.CreateDirectory(unZipDir);

        try             {
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
            {
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);
                    if (directoryName.Length > 0)
                    {
                        Directory.CreateDirectory(unZipDir + directoryName);
                    }
                    if (!directoryName.EndsWith("http://"))
                        directoryName += "http://";
                    if (fileName != String.Empty)
                    {
                        using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
                        {
                            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;
                                }
                            }
                        }
                    }
                }
            }
        }
        catch 
        {
            throw;
        }
    }
    #endregion     }

}</pre>

3.利用java的壓縮和解壓縮方法,需引用vjslib.dll

至于這種方法的使用,大家可以去查閱msdn,這里就不寫了

4.利用zlibwapi.dll的API進行壓縮

據說壓縮效率比較好,但是在網上沒找到供下載的鏈接,有興趣的朋友可以試試

5.使用System.IO.Packaging壓縮和解壓

System.IO.Packaging在WindowsBase.dll程序集下,使用時需要添加對WindowsBase的引用

/// <summary>         /// Add a folder along with its subfolders to a Package
        /// </summary>         /// <param name="folderName">The folder to add</param>         /// <param name="compressedFileName">The package to create</param>         /// <param name="overrideExisting">Override exsisitng files</param>         /// <returns></returns>         static bool PackageFolder(string folderName, string compressedFileName, bool overrideExisting)
        {
            if (folderName.EndsWith(@"\"))
                folderName = folderName.Remove(folderName.Length - 1);
            bool result = false;
            if (!Directory.Exists(folderName))
            {
                return result;
            }

        if (!overrideExisting && File.Exists(compressedFileName))
        {
            return result;
        }
        try             {
            using (Package package = Package.Open(compressedFileName, FileMode.Create))
            {
                var fileList = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
                foreach (string fileName in fileList)
                {

                    //The path in the package is all of the subfolders after folderName                         string pathInPackage;
                    pathInPackage = Path.GetDirectoryName(fileName).Replace(folderName, string.Empty) + "/" + Path.GetFileName(fileName);

                    Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(pathInPackage, UriKind.Relative));
                    PackagePart packagePartDocument = package.CreatePart(partUriDocument,"", CompressionOption.Maximum);
                    using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                    {
                        fileStream.CopyTo(packagePartDocument.GetStream());
                    }
                }
            }
            result = true;
        }
        catch (Exception e)
        {
            throw new Exception("Error zipping folder " + folderName, e);
        }

        return result;
    }


/// <summary> /// Compress a file into a ZIP archive as the container store /// </summary> /// <param name="fileName">The file to compress</param> /// <param name="compressedFileName">The archive file</param> /// <param name="overrideExisting">override existing file</param> /// <returns></returns> static bool PackageFile(string fileName, string compressedFileName, bool overrideExisting) { bool result = false;

        if (!File.Exists(fileName))
        {
            return result;
        }

        if (!overrideExisting && File.Exists(compressedFileName))
        {
            return result;
        }

        try             {
            Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(Path.GetFileName(fileName), UriKind.Relative));

            using (Package package = Package.Open(compressedFileName, FileMode.OpenOrCreate))
            {
                if (package.PartExists(partUriDocument))
                {
                    package.DeletePart(partUriDocument);
                } 

                PackagePart packagePartDocument = package.CreatePart(partUriDocument, "", CompressionOption.Maximum);
                using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    fileStream.CopyTo(packagePartDocument.GetStream());
                }
            }
            result = true;
        }
        catch (Exception e)
        {
            throw new Exception("Error zipping file " + fileName, e);
        }

        return result;
    }


} 3、zip文件解壓

Code/// <summary> /// Extract a container Zip. NOTE: container must be created as Open Packaging Conventions (OPC) specification /// </summary> /// <param name="folderName">The folder to extract the package to</param> /// <param name="compressedFileName">The package file</param> /// <param name="overrideExisting">override existing files</param> /// <returns></returns> static bool UncompressFile(string folderName, string compressedFileName, bool overrideExisting) { bool result = false; try { if (!File.Exists(compressedFileName)) { return result; }

            DirectoryInfo directoryInfo = new DirectoryInfo(folderName);
            if (!directoryInfo.Exists)
                directoryInfo.Create();</pre>來自:http://blog.csdn.net/make1828/article/details/11163457<br />
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!