zoukankan      html  css  js  c++  java
  • 使用微软自带解压类压缩文件夹

    前言

    因为即时通信项目中,需要同步OA中的用户头像,用户头像是通过文件夹保存的,文件夹内结构比较复杂。在即时通信中需要先将OA服务器上保存的用户头像文件夹下载下来,因为直接下载文件夹方法很难,所以需要先将文件夹压缩一下,然后在直接下载压缩文件。

    他人雅慧

    在网上找了不少了例子,几乎都是使用SharpZipLib开源库的方式,大体看了一下,感觉比较复杂,后在某篇教程的评论中发现更好的方式,于.net  framework 4.5框架以后,可以直接使用微软官方的ZipFile类就可,实践后发现真的好用,什么都不需要管,直接调用方法就行,果然还是微软爸爸比较强大。(不需要考虑递归文件夹)

    使用方法

    准备
    添加dll:
    右键项目添加程序集 System.IO.Compression.dll,System.IO.Compression.FileSystem.dll

    压缩
    ZipFile.CreateFromDirectory(@"F:APS.DataInterfaceinDebug", AppDomain.CurrentDomain.BaseDirectory+"newdebug.zip");
    解释一下两个参数,第一个参数是要 压缩的文件(文件夹),第二个参数是保存压缩内容的文件。

    解压
    ZipFile.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory+"newdebug.zip", @"F:APS.DataInterfaceinDebug");

    解释一下两个参数,第一个参数是要 解压的zip文件,第二个参数是保存解压内容的路径。

    其他的一些操作
    提取单个文件

    using (ZipArchive zipArchive =
    ZipFile.Open(AppDomain.CurrentDomain.BaseDirectory + "newdebug.zip", ZipArchiveMode.Read))
    {
    foreach (ZipArchiveEntry entry in zipArchive.Entries)
    {
    if (entry.Name == "APS.EP.Controls.dll")
    {
    using (Stream stream = entry.Open())
    {
    if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "oneone"))
    {
    Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "oneone");
    }
    entry.ExtractToFile(AppDomain.CurrentDomain.BaseDirectory + "oneone\APS.EP.Controls.dll", true);
    }
    }
    }
    }

    压缩指定文件类型文件
    IEnumerable<string> files =
    Directory.EnumerateFiles@"F:APS.DataInterfaceinDebug", "*.dll");
    using (ZipArchive zipArchive =
    ZipFile.Open(AppDomain.CurrentDomain.BaseDirectory+"newdebug.zip", ZipArchiveMode.Create))
    {
    foreach (string file in files)
    {
    var entryName = Path.Combine("DLL", Path.GetFileName(file));
    zipArchive.CreateEntryFromFile(file, entryName);
    }
    }

    当然还有其他的一些方法,暂时用不到,不多做研究。

    项目实战中的简单通用类

      1 /// <summary>
      2     /// 压缩、解压帮助类
      3     /// </summary>
      4     public class ZipHelper
      5     {
      6         #region 单例模式
      7         private volatile static ZipHelper _instance = null;
      8         private static readonly object lockHelper = new object();//线程锁
      9         public static ZipHelper Instance
     10         {
     11             get
     12             {
     13                 if (_instance == null)
     14                 {
     15                     lock (lockHelper)
     16                     {
     17                         if (_instance == null)
     18                         {
     19                             _instance = new ZipHelper();
     20                         }
     21                     }
     22                 }
     23                 return _instance;
     24             }
     25         }
     26         #endregion 单例模式
     27 
     28         #region 构造函数
     29         public ZipHelper()
     30         {
     31 
     32         }
     33         #endregion 构造函数
     34 
     35         #region 方法
     36         /// <summary>
     37         /// 简单压缩方法
     38         /// </summary>
     39         /// <param name="filepath">压缩内容路径</param>
     40         /// <param name="zippath">压缩后文件保存路径</param>
     41         /// <returns></returns>
     42         public bool Compress(string filepath,string zippath)
     43         {
     44             try
     45             {
     46                 if (!Directory.Exists(filepath)) return false;
     47                 CreateDirectory(zippath);
     48                 ZipFile.CreateFromDirectory(filepath, zippath);
     49             }
     50             catch (Exception ex)
     51             {
     52                 string errormes =LogHelper.ToMessage(ex);
     53                 string path = string.Empty;
     54                 path += AppDomain.CurrentDomain.BaseDirectory;
     55                 path += @"logipErrorLogip";
     56                 path += DateTime.Now.ToString("yyyyMMddHHmm");
     57                 path += ".txt";
     58                 LogHelper.Instance.WriteLog(path, errormes);
     59                 return false;
     60             }
     61             return true;
     62         }
     63         /// <summary>
     64         /// 简单解压方法
     65         /// </summary>
     66         /// <param name="zippath">压缩文件所在路径</param>
     67         /// <param name="savepath">解压后保存路径</param>
     68         /// <returns></returns>
     69         public bool DeCompress(string zippath,string savepath)
     70         {
     71             try
     72             {
     73                 if (!Directory.Exists(zippath)) return false;
     74                 ZipFile.ExtractToDirectory(zippath, savepath);
     75             }
     76             catch (Exception ex)
     77             {
     78                 string errormes = LogHelper.ToMessage(ex);
     79                 string path = string.Empty;
     80                 path += AppDomain.CurrentDomain.BaseDirectory;
     81                 path += @"logipErrorLogDEZip";
     82                 path += DateTime.Now.ToString("yyyyMMddHHmm");
     83                 path += ".txt";
     84                 LogHelper.Instance.WriteLog(path, errormes);
     85                 return false;
     86             }
     87             return true;
     88         }
     89 
     90         /// <summary>
     91         /// 指定目录下压缩指定类型文件
     92         /// </summary>
     93         /// <param name="filepath">指定目录</param>
     94         /// <param name="zippath">压缩后保存路径</param>
     95         /// <param name="folderName">压缩文件内部文件夹名</param>
     96         /// <param name="fileType">指定类型 格式如:*.dll</param>
     97         /// <returns></returns>
     98         public bool Compress(string filepath, string zippath,string folderName,string fileType)
     99         {
    100             try
    101             {
    102                 IEnumerable<string> files =
    103               Directory.EnumerateFiles(filepath, fileType);
    104                 using (ZipArchive zipArchive =
    105                   ZipFile.Open(zippath, ZipArchiveMode.Create))
    106                 {
    107                     foreach (string file in files)
    108                     {
    109                         var entryName = System.IO.Path.Combine(folderName, System.IO.Path.GetFileName(file));
    110                         zipArchive.CreateEntryFromFile(file, entryName);
    111                     }
    112                 }
    113             }
    114             catch (Exception ex)
    115             {
    116                 string errormes = LogHelper.ToMessage(ex);
    117                 string path = string.Empty;
    118                 path += AppDomain.CurrentDomain.BaseDirectory;
    119                 path += @"logipErrorLogip1";
    120                 path += DateTime.Now.ToString("yyyyMMddHHmm");
    121                 path += ".txt";
    122                 LogHelper.Instance.WriteLog(path, errormes);
    123                 return false;
    124             }
    125             return true;
    126         }
    127 
    128         #region 调用方法
    129         /// <summary>
    130         /// 创建父级路径
    131         /// </summary>
    132         /// <param name="infoPath"></param>
    133         private void CreateDirectory(string infoPath)
    134         {
    135             DirectoryInfo directoryInfo = Directory.GetParent(infoPath);
    136             if (!directoryInfo.Exists)
    137             {
    138                 directoryInfo.Create();
    139             }
    140         }
    141 
    142         #endregion 
    143         #endregion 方法
    144     }
    View Code

    尾声

    解压压缩的方法还有很多,但既然可以使用微软自带的方法,何乐而不为呢。

  • 相关阅读:
    HTML <iframe> 标签
    HTML <tr> 标签
    HTML <img> 标签的 border 属性
    jQuery ajax ajax() 方法
    CSS padding 属性
    SQL Server CONVERT() 函数
    CSS overflow 属性
    HTML <input> 标签
    Java动态代理一——动态类Proxy的使用
    Java拆箱装箱小结
  • 原文地址:https://www.cnblogs.com/adingfirstlove/p/9958793.html
Copyright © 2011-2022 走看看