经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
使用微软自带解压类压缩文件夹
来源:cnblogs  作者:流浪阿丁  时间:2018/11/16 10:31:20  对本文有异议

前言

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

 

他人雅慧

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

 

使用方法

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

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

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

解释一下两个参数,第一个参数是要 解压的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.DataInterface\bin\Debug", "*.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.   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 += @"log\ZipErrorLog\Zip"; 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 += @"log\ZipErrorLog\DEZip"; 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             try101             {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 += @"log\ZipErrorLog\Zip1";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

 

尾声

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号