关于DotNetZip的用法

简介: 关于DotNetZip的用法

公司有个项目要求解压缩操作,一直在使用WinRar和Gzip一个有版权问题,一个效率存在问题,因此决定找一个开源高效的第三方插件。这个时候DotNetZip映入眼帘,他不仅仅能压缩,还能分卷压缩,对中文的至此也是很好。但这些都是在网络上查找时大家说的,基本没见代码如何写,DotNetZip本身使用简单,DLL也不是很大,所以我就使用到项目内。但在使用的过程中发现分卷压缩到底如何实现?解压中文依旧有问题?找了很多资料居然没这个方面的东西,没办法只好去官方查找资料。官方地址:http://dotnetzip.codeplex.com/

在官方看到一些信息不过没看到关于分卷压缩的内容,只好一点一点看属性,个人感觉分卷压缩就是给他一个分卷值,之后在设定一个属性告诉他要分卷压缩即可,黄天不负有心人我找到分卷压缩的属性了。MaxOutputSegmentSize这个属性就是分卷压缩值,设置他的大小即可,他的单位是Kb。

解压的时候对中文至此不是很好,找了好久也不知道如何解决,后来在坛子里发帖,也没得到很好的解答,官方的示例代码是这样写道


using (ZipFile zip = new ZipFile())
{
  zip.Encoding = System.Text.Encoding.GetEncoding("big5"); // chinese
  zip.AddDirectory(@"MyDocuments\ProjectX");
  zip.Save(ZipFileToCreate);
}


可这个Encoding属性在1.9.1.8这个版本已经不存在了,所以针对中文乱码的问题依旧。找了好多文章看也没有这个版本如何解决的,最主要的是这个DLL的资料比较少。后来实在没有办法就去看看了源代码,终于找到了他的最新写法,好了废话不多说了直接看如何支持分卷压缩和中文不乱那么的代码吧,算是给自己提醒也是和大家分享下。

public static bool ZipFolder(
            String sourceFilePath,
            String targetFileFullPath,
            Boolean isUsePassword,
            Int32 maxOutputSegmentSiez,
            out String errMessage)
        {
            try
            {
                using (ZipFile zip = new ZipFile(Encoding.Default))
                {
                    errMessage = String.Empty;
                    zip.Comment = "压缩文件时间" + System.DateTime.Now.ToString("G");
                    zip.Name = Guid.NewGuid().ToString().ToUpper() + ".zip";
                    if (isUsePassword)
                        zip.Password = D7.Base.ConstParameter.ZipPassWord;
                    zip.MaxOutputSegmentSize = maxOutputSegmentSiez * 1000;
                    zip.BufferSize = 1024;
                    zip.CaseSensitiveRetrieval = true;
                    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
                    zip.AddDirectory(sourceFilePath);
                    zip.Save(targetFileFullPath);
                    return true;
                }
            }
            catch (Exception ex) { errMessage = ex.Message; return false; }
        }
public static bool ExtractFile(String sourceFileFullPath,
            String targetFilePath,
            out String errMessage)
        {
            return ExtractFile(sourceFileFullPath, targetFilePath, true, out errMessage);
        }
        public static bool ExtractFile(String sourceFileFullPath,
            String targetFilePath,
            Boolean isUsePassword,
            out String errMessage)
        {
            try
            {                
                Encoding encoding = Utils.GetEncodingType(sourceFileFullPath);
                errMessage = String.Empty;
                var options = new ReadOptions { StatusMessageWriter = System.Console.Out, Encoding = encoding };
                using (ZipFile zip = ZipFile.Read(sourceFileFullPath, options))
                {
                    if (isUsePassword)
                        zip.Password = D7.Base.ConstParameter.ZipPassWord;                    
                    zip.AlternateEncoding = encoding;                    
                    zip.ExtractAll(targetFilePath, ExtractExistingFileAction.OverwriteSilently);
                    return true;
                }
            }
            catch (Exception ex) { errMessage = ex.Message; return false; }
        }

这2个方法就是引用了Ionic.Zip.dll 1.9.1.8版本写的,DLL下载地址是http://dotnetzip.codeplex.com/releases/view/68268

好了,解压和压缩都有了,可以分卷,可以加密码,支持中文。代码红色区域是如何支持中文的,其中Encoding encoding = Utils.GetEncodingType(sourceFileFullPath);

使用了一个小方法获取文件的内部编码,之后在赋值给DotNetZip即可,代码网上有很多不贴了。

目录
打赏
0
0
0
0
186
分享
相关文章
FilterChain用法总结
FilterChain用法总结
RACSignal的八种常用用法
RACSignal的八种常用用法
95 0
@ConditionalOnProperty的用法
@ConditionalOnProperty的用法
410 0
ClientToScreen 和ScreenToClient 用法
<div class="mod-page-main wordwrap clearfix"> <div class="x-page-container"> <div class="mod-blogpage-wraper"> <div class="grid-80 mod-blogpage"> <div class="mod-text-content mod-post-content
3059 0
$.each()的用法
$.each()的用法
268 0
DatabaseMetaData的用法(转)
DatabaseMetaData的用法(转)
613 0
Systrace的用法小结
通过SysTrace可以帮助我们分析性能问题,包含方法的耗时时长、CPU的使用情况、ANR、布局情况等;相比性能工具TraceView,主要用来分析每个方法的执行时间,对于冷启动而言,想抓trace只能通过代码的方式,这样会导致整个应用比较卡顿,测试出的方法时间,不是真正的执行时间,只能看下时间长短的相对占比。
3517 0
EasyTouch基本用法
EasyTouch基本用法 本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) ...
1542 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等