zoukankan      html  css  js  c++  java
  • c#压缩和解压缩

    C# 文件/文件夹压缩解压缩

     

    项目上用到的,随手做个记录,哈哈。

    直接上代码:

    复制代码
      1 using System;
      2 using System.Data;
      3 using System.Configuration;
      4 using System.Collections.Generic;
      5 using System.IO;
      6 using ICSharpCode.SharpZipLib.Zip;
      7 using ICSharpCode.SharpZipLib.Checksums;
      8 namespace BLL
      9 {
     10     /// <summary>  
     11     /// 文件(夹)压缩、解压缩  
     12     /// </summary>  
     13     public class FileCompression
     14     {
     15         #region 压缩文件
     16         /// <summary>    
     17         /// 压缩文件    
     18         /// </summary>    
     19         /// <param name="fileNames">要打包的文件列表</param>    
     20         /// <param name="GzipFileName">目标文件名</param>    
     21         /// <param name="CompressionLevel">压缩品质级别(0~9)</param>    
     22         /// <param name="deleteFile">是否删除原文件</param>  
     23         public static void CompressFile(List<FileInfo> fileNames, string GzipFileName, int CompressionLevel, bool deleteFile)
     24         {
     25             ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName));
     26             try
     27             {
     28                 s.SetLevel(CompressionLevel);   //0 - store only to 9 - means best compression    
     29                 foreach (FileInfo file in fileNames)
     30                 {
     31                     FileStream fs = null;
     32                     try
     33                     {
     34                         fs = file.Open(FileMode.Open, FileAccess.ReadWrite);
     35                     }
     36                     catch
     37                     { continue; }
     38                     //  方法二,将文件分批读入缓冲区    
     39                     byte[] data = new byte[2048];
     40                     int size = 2048;
     41                     ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));
     42                     entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime);
     43                     s.PutNextEntry(entry);
     44                     while (true)
     45                     {
     46                         size = fs.Read(data, 0, size);
     47                         if (size <= 0) break;
     48                         s.Write(data, 0, size);
     49                     }
     50                     fs.Close();
     51                     if (deleteFile)
     52                     {
     53                         file.Delete();
     54                     }
     55                 }
     56             }
     57             finally
     58             {
     59                 s.Finish();
     60                 s.Close();
     61             }
     62         }
     63         /// <summary>    
     64         /// 压缩文件夹    
     65         /// </summary>    
     66         /// <param name="dirPath">要打包的文件夹</param>    
     67         /// <param name="GzipFileName">目标文件名</param>    
     68         /// <param name="CompressionLevel">压缩品质级别(0~9)</param>    
     69         /// <param name="deleteDir">是否删除原文件夹</param>  
     70         public static void CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir)
     71         {
     72             //压缩文件为空时默认与压缩文件夹同一级目录    
     73             if (GzipFileName == string.Empty)
     74             {
     75                 GzipFileName = dirPath.Substring(dirPath.LastIndexOf("//") + 1);
     76                 GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("//")) + "//" + GzipFileName + ".zip";
     77             }
     78             //if (Path.GetExtension(GzipFileName) != ".zip")  
     79             //{  
     80             //    GzipFileName = GzipFileName + ".zip";  
     81             //}  
     82             using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName)))
     83             {
     84                 zipoutputstream.SetLevel(CompressionLevel);
     85                 Crc32 crc = new Crc32();
     86                 Dictionary<string, DateTime> fileList = GetAllFies(dirPath);
     87                 foreach (KeyValuePair<string, DateTime> item in fileList)
     88                 {
     89                     FileStream fs = File.OpenRead(item.Key.ToString());
     90                     byte[] buffer = new byte[fs.Length];
     91                     fs.Read(buffer, 0, buffer.Length);
     92                     ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length));
     93                     entry.DateTime = item.Value;
     94                     entry.Size = fs.Length;
     95                     fs.Close();
     96                     crc.Reset();
     97                     crc.Update(buffer);
     98                     entry.Crc = crc.Value;
     99                     zipoutputstream.PutNextEntry(entry);
    100                     zipoutputstream.Write(buffer, 0, buffer.Length);
    101                 }
    102             }
    103             if (deleteDir)
    104             {
    105                 Directory.Delete(dirPath, true);
    106             }
    107         }
    108         /// <summary>    
    109         /// 获取所有文件    
    110         /// </summary>    
    111         /// <returns></returns>    
    112         private static Dictionary<string, DateTime> GetAllFies(string dir)
    113         {
    114             Dictionary<string, DateTime> FilesList = new Dictionary<string, DateTime>();
    115             DirectoryInfo fileDire = new DirectoryInfo(dir);
    116             if (!fileDire.Exists)
    117             {
    118                 throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
    119             }
    120             GetAllDirFiles(fileDire, FilesList);
    121             GetAllDirsFiles(fileDire.GetDirectories(), FilesList);
    122             return FilesList;
    123         }
    124         /// <summary>    
    125         /// 获取一个文件夹下的所有文件夹里的文件    
    126         /// </summary>    
    127         /// <param name="dirs"></param>    
    128         /// <param name="filesList"></param>    
    129         private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary<string, DateTime> filesList)
    130         {
    131             foreach (DirectoryInfo dir in dirs)
    132             {
    133                 foreach (FileInfo file in dir.GetFiles("*.*"))
    134                 {
    135                     filesList.Add(file.FullName, file.LastWriteTime);
    136                 }
    137                 GetAllDirsFiles(dir.GetDirectories(), filesList);
    138             }
    139         }
    140         /// <summary>    
    141         /// 获取一个文件夹下的文件    
    142         /// </summary>    
    143         /// <param name="dir">目录名称</param>    
    144         /// <param name="filesList">文件列表HastTable</param>    
    145         private static void GetAllDirFiles(DirectoryInfo dir, Dictionary<string, DateTime> filesList)
    146         {
    147             foreach (FileInfo file in dir.GetFiles("*.*"))
    148             {
    149                 filesList.Add(file.FullName, file.LastWriteTime);
    150             }
    151         }
    152         #endregion
    153         #region 解压缩文件
    154         /// <summary>    
    155         /// 解压缩文件    
    156         /// </summary>    
    157         /// <param name="GzipFile">压缩包文件名</param>    
    158         /// <param name="targetPath">解压缩目标路径</param>           
    159         public static void Decompress(string GzipFile, string targetPath)
    160         {
    161             //string directoryName = Path.GetDirectoryName(targetPath + "//") + "//";    
    162             string directoryName = targetPath;
    163             if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解压目录    
    164             string CurrentDirectory = directoryName;
    165             byte[] data = new byte[2048];
    166             int size = 2048;
    167             ZipEntry theEntry = null;
    168             using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile)))
    169             {
    170                 while ((theEntry = s.GetNextEntry()) != null)
    171                 {
    172                     if (theEntry.IsDirectory)
    173                     {// 该结点是目录    
    174                         if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name);
    175                     }
    176                     else
    177                     {
    178                         if (theEntry.Name != String.Empty)
    179                         {
    180                             //  检查多级目录是否存在  
    181                             if (theEntry.Name.Contains("//"))
    182                             {
    183                                 string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf("//") + 1);
    184                                 if (!Directory.Exists(parentDirPath))
    185                                 {
    186                                     Directory.CreateDirectory(CurrentDirectory + parentDirPath);
    187                                 }
    188                             }
    189 
    190                             //解压文件到指定的目录    
    191                             using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name))
    192                             {
    193                                 while (true)
    194                                 {
    195                                     size = s.Read(data, 0, data.Length);
    196                                     if (size <= 0) break;
    197                                     streamWriter.Write(data, 0, size);
    198                                 }
    199                                 streamWriter.Close();
    200                             }
    201                         }
    202                     }
    203                 }
    204                 s.Close();
    205             }
    206         }
    207         #endregion
    208     }
    209 }
    复制代码

    封装的很彻底,基本不用修改什么,直接拿来用就行了。

    找了很久,终于知道怎么把源代码附上了

    源代码:https://files.cnblogs.com/files/hahahayang/C%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6.zip

  • 相关阅读:
    在Mybatis中使用连表查询的一次实际应用
    Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查
    一次org.springframework.jdbc.BadSqlGrammarException ### Error querying database Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException问题排查过程
    商品的spu、sku及其之间的关系
    Java transient关键字的理解
    关于Serializable的一个形象的例子
    一个很大的文件,存放了10G个整数的乱序数列,如何用程序找出中位数。
    Logger.error方法之打印错误异常的详细堆栈信息
    什么是Http无状态?Session、Cookie、Token三者之间的区别
    接口API中的敏感数据基于AES进行安全加密后返回
  • 原文地址:https://www.cnblogs.com/qiu18359243869/p/10955007.html
Copyright © 2011-2022 走看看