zoukankan      html  css  js  c++  java
  • .Net 下利用ICSharpCode.SharpZipLib.dll实现文件压缩、解压缩 dodo

    添加引用ICSharpCode.SharpZipLib.dll

    1. using System;   
    2. using System.Collections.Generic;   
    3. using System.IO;   
    4. using System.Threading;   
    5. using ICSharpCode.SharpZipLib.Zip;   
    6.   
    7. namespace Lib   
    8. {   
    9.     /// <summary>   
    10.     /// 文件压缩、解压缩   
    11.     /// </summary>   
    12.     public class FileCompression   
    13.     {   
    14.         /// <summary>   
    15.         /// 构造函数   
    16.         /// </summary>   
    17.         public FileCompression()   
    18.         {   
    19.         }  
    20.         #region 加密、压缩文件   
    21.         /// <summary>   
    22.         /// 压缩文件   
    23.         /// </summary>   
    24.         /// <param name="fileNames">要打包的文件列表</param>   
    25.         /// <param name="GzipFileName">目标文件名</param>   
    26.         /// <param name="CompressionLevel">压缩品质级别(0~9)</param>   
    27.         /// <param name="SleepTimer">休眠时间(单位毫秒)</param>        
    28.         public static void Compress(List<FileInfo> fileNames, string GzipFileName, int CompressionLevel, int SleepTimer)   
    29.         {   
    30.             ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName));   
    31.             try  
    32.             {   
    33.                 s.SetLevel(CompressionLevel);   //0 - store only to 9 - means best compression   
    34.                 foreach (FileInfo file in fileNames)   
    35.                 {   
    36.                     FileStream fs = null;   
    37.                     try  
    38.                     {   
    39.                         fs = file.Open(FileMode.Open, FileAccess.ReadWrite);   
    40.                     }   
    41.                     catch  
    42.                     { continue; }                      
    43.                     //  方法二,将文件分批读入缓冲区   
    44.                     byte[] data = new byte[2048];   
    45.                     int size = 2048;   
    46.                     ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));   
    47.                     entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime);   
    48.                     s.PutNextEntry(entry);   
    49.                     while (true)   
    50.                     {   
    51.                         size = fs.Read(data, 0, size);   
    52.                         if (size <= 0) break;                          
    53.                         s.Write(data, 0, size);   
    54.                     }   
    55.                     fs.Close();   
    56.                     file.Delete();   
    57.                     Thread.Sleep(SleepTimer);   
    58.                 }   
    59.             }   
    60.             finally  
    61.             {   
    62.                 s.Finish();   
    63.                 s.Close();   
    64.             }   
    65.         }  
    66.         #endregion  
    67.         #region 解密、解压缩文件   
    68.         /// <summary>   
    69.         /// 解压缩文件   
    70.         /// </summary>   
    71.         /// <param name="GzipFile">压缩包文件名</param>   
    72.         /// <param name="targetPath">解压缩目标路径</param>          
    73.         public static void Decompress(string GzipFile, string targetPath)   
    74.         {    
    75.             //string directoryName = Path.GetDirectoryName(targetPath + "\\") + "\\";   
    76.             string directoryName = targetPath;   
    77.             if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解压目录   
    78.             string CurrentDirectory = directoryName;   
    79.             byte[] data = new byte[2048];   
    80.             int size = 2048;   
    81.             ZipEntry theEntry = null;              
    82.             using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile)))   
    83.             {   
    84.                 while ((theEntry = s.GetNextEntry()) != null)   
    85.                 {   
    86.                     if (theEntry.IsDirectory)   
    87.                     {// 该结点是目录   
    88.                         if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name);   
    89.                     }   
    90.                     else  
    91.                     {   
    92.                         if (theEntry.Name != String.Empty)   
    93.                         {   
    94.                             //解压文件到指定的目录   
    95.                             using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name))   
    96.                             {   
    97.                                 while (true)   
    98.                                 {   
    99.                                     size = s.Read(data, 0, data.Length);   
    100.                                     if (size <= 0) break;   
    101.                                       
    102.                                     streamWriter.Write(data, 0, size);   
    103.                                 }   
    104.                                 streamWriter.Close();   
    105.                             }   
    106.                         }   
    107.                     }   
    108.                 }   
    109.                 s.Close();   
    110.             }              
    111.         }  
    112.         #endregion   
    113.     }   
    114. }  

    前台调用:

    /// <summary>
        /// 压缩
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnCompress_Click(object sender, EventArgs e)
        {
            String path = Server.MapPath("~/Files/");
            // 检查文件是否存在
            if (File.Exists(path + "第2章 使用数据库.pdf"))
            {
                FileInfo fi1 = new FileInfo(path + "第2章 使用数据库.pdf");
                FileInfo fi2 = new FileInfo(path + "第3章 使用数据绑定和DataSet.pdf");
                FileInfo fi3 = new FileInfo(path + "第4章 SQL Server XML的功能.pdf");
                FileInfo fi4 = new FileInfo(path + "第5章 XML编程.pdf");
                List<FileInfo> fileList = new List<FileInfo>();
                fileList.Add(fi1);
                fileList.Add(fi2);
                fileList.Add(fi3);
                fileList.Add(fi4);
                //  调用方法
                string targetZipFilePath = Server.MapPath("~/ZipFile/") + "Book.zip";// 扩展名可随意
                Lib.FileCompression.Compress(fileList, targetZipFilePath, 5, 5);
                Response.Write("文件压缩成功,请在ZipFile文件夹查看。");
            }
            else
            {
                Response.Write("被压缩文件不存在,请先解压文件。");
            }     

        }

        /// <summary>
        /// 解压缩
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDecompress_Click(object sender, EventArgs e)
        {
            string zipFilePath = Server.MapPath("~/ZipFile/") + "Book.zip";//
            if (File.Exists(zipFilePath))
            {
                string targetPath = Server.MapPath("~/Files/");
                Lib.FileCompression.Decompress(zipFilePath, targetPath);
                ////  解压后要删除zip文件
                //File.Delete(zipFilePath);
                Response.Write("文件解压成功,请在Files文件夹查看。");
            }
            else
            {
                Response.Write("压缩文件不存在,请先压缩文件。");
            }
        }
    }

  • 相关阅读:
    高德全链路压测平台TestPG的架构与实践
    性能测试之稳定性测试(可靠性测试)
    服务端高并发分布式架构演进之路
    高性能高并发系统的稳定性保障
    聊聊服务稳定性保障这些事
    qt 待研究
    k73 uboot 和emmc启动移植
    Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
    C++ Lambda 编译器实现原理
    qt 网络编程参考资料
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/2065969.html
Copyright © 2011-2022 走看看