/**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博客内容

在.NET可以通过多种方式实现zip的压缩和解压:1、使用System.IO.Packaging;2、使用第三方类库;3、通过 System.IO.Compression 命名空间中新增的ZipArchive、ZipFile等类实现。

一、使用System.IO.Packaging压缩和解压

Package为一个抽象类,可用于将对象组织到定义的物理格式的单个实体中,从而实现可移植性与高效访问。ZIP 文件是Package的主物理格式。 其他Package实现可以使用其他物理格式(如 XML 文档、数据库或 Web 服务。与文件系统类似,在分层组织的文件夹和文件中引用 Package 中包含的项。虽然 Package 是抽象类,但 Package.Open 方法默认使用 ZipPackage 派生类。

System.IO.Packaging在WindowsBase.dll程序集下,使用时需要添加对WindowsBase的引用。

1、将整个文件夹压缩成zip

  1. /// <summary>
  2. /// Add a folder along with its subfolders to a Package
  3. /// </summary>
  4. /// <param name="folderName">The folder to add</param>
  5. /// <param name="compressedFileName">The package to create</param>
  6. /// <param name="overrideExisting">Override exsisitng files</param>
  7. /// <returns></returns>
  8. static bool PackageFolder(string folderName, string compressedFileName, bool overrideExisting)
  9. {
  10. if (folderName.EndsWith(@"\"))
  11. folderName = folderName.Remove(folderName.Length - 1);
  12. bool result = false;
  13. if (!Directory.Exists(folderName))
  14. {
  15. return result;
  16. }
  17.  
  18. if (!overrideExisting && File.Exists(compressedFileName))
  19. {
  20. return result;
  21. }
  22. try
  23. {
  24. using (Package package = Package.Open(compressedFileName, FileMode.Create))
  25. {
  26. var fileList = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
  27. foreach (string fileName in fileList)
  28. {
  29.  
  30. //The path in the package is all of the subfolders after folderName
  31. string pathInPackage;
  32. pathInPackage = Path.GetDirectoryName(fileName).Replace(folderName, string.Empty) + "/" + Path.GetFileName(fileName);
  33.  
  34. Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(pathInPackage, UriKind.Relative));
  35. PackagePart packagePartDocument = package.CreatePart(partUriDocument,"", CompressionOption.Maximum);
  36. using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  37. {
  38. fileStream.CopyTo(packagePartDocument.GetStream());
  39. }
  40. }
  41. }
  42. result = true;
  43. }
  44. catch (Exception e)
  45. {
  46. throw new Exception("Error zipping folder " + folderName, e);
  47. }
  48.  
  49. return result;
  50. }

2、将单个文件添加到zip文件中

  1. /// <summary>
  2. /// Compress a file into a ZIP archive as the container store
  3. /// </summary>
  4. /// <param name="fileName">The file to compress</param>
  5. /// <param name="compressedFileName">The archive file</param>
  6. /// <param name="overrideExisting">override existing file</param>
  7. /// <returns></returns>
  8. static bool PackageFile(string fileName, string compressedFileName, bool overrideExisting)
  9. {
  10. bool result = false;
  11.  
  12. if (!File.Exists(fileName))
  13. {
  14. return result;
  15. }
  16.  
  17. if (!overrideExisting && File.Exists(compressedFileName))
  18. {
  19. return result;
  20. }
  21.  
  22. try
  23. {
  24. Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(Path.GetFileName(fileName), UriKind.Relative));
  25.  
  26. using (Package package = Package.Open(compressedFileName, FileMode.OpenOrCreate))
  27. {
  28. if (package.PartExists(partUriDocument))
  29. {
  30. package.DeletePart(partUriDocument);
  31. }
  32.  
  33. PackagePart packagePartDocument = package.CreatePart(partUriDocument, "", CompressionOption.Maximum);
  34. using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  35. {
  36. fileStream.CopyTo(packagePartDocument.GetStream());
  37. }
  38. }
  39. result = true;
  40. }
  41. catch (Exception e)
  42. {
  43. throw new Exception("Error zipping file " + fileName, e);
  44. }
  45.  
  46. return result;
  47. }

3、zip文件解压

  1. /// <summary>
  2. /// Extract a container Zip. NOTE: container must be created as Open Packaging Conventions (OPC) specification
  3. /// </summary>
  4. /// <param name="folderName">The folder to extract the package to</param>
  5. /// <param name="compressedFileName">The package file</param>
  6. /// <param name="overrideExisting">override existing files</param>
  7. /// <returns></returns>
  8. static bool UncompressFile(string folderName, string compressedFileName, bool overrideExisting)
  9. {
  10. bool result = false;
  11. try
  12. {
  13. if (!File.Exists(compressedFileName))
  14. {
  15. return result;
  16. }
  17.  
  18. DirectoryInfo directoryInfo = new DirectoryInfo(folderName);
  19. if (!directoryInfo.Exists)
  20. directoryInfo.Create();
  21.  
  22. using (Package package = Package.Open(compressedFileName, FileMode.Open, FileAccess.Read))
  23. {
  24. foreach (PackagePart packagePart in package.GetParts())
  25. {
  26. ExtractPart(packagePart, folderName, overrideExisting);
  27. }
  28. }
  29.  
  30. result = true;
  31. }
  32. catch (Exception e)
  33. {
  34. throw new Exception("Error unzipping file " + compressedFileName, e);
  35. }
  36.  
  37. return result;
  38. }
  39.  
  40. static void ExtractPart(PackagePart packagePart, string targetDirectory, bool overrideExisting)
  41. {
  42. string stringPart = targetDirectory + HttpUtility.UrlDecode(packagePart.Uri.ToString()).Replace('\\', '/');
  43.  
  44. if (!Directory.Exists(Path.GetDirectoryName(stringPart)))
  45. Directory.CreateDirectory(Path.GetDirectoryName(stringPart));
  46.  
  47. if (!overrideExisting && File.Exists(stringPart))
  48. return;
  49. using (FileStream fileStream = new FileStream(stringPart, FileMode.Create))
  50. {
  51. packagePart.GetStream().CopyTo(fileStream);
  52. }
  53. }

使用Package压缩文件会在zip文件自动生成[Content_Type].xml,用来描述zip文件解压支持的文件格式。

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  3. <Default Extension="vsixmanifest" ContentType="text/xml" />
  4. <Default Extension="dll" ContentType="application/octet-stream" />
  5. <Default Extension="png" ContentType="application/octet-stream" />
  6. <Default Extension="txt" ContentType="text/plain" />
  7. <Default Extension="pkgdef" ContentType="text/plain" />
  8. </Types>

同样,如果zip文件不包含[Content_Type].xml文件,或者[Content_Type].xml文件不包含所对应扩展名的描述(手动添加的[Content_Type].xml也是可以),将无法解压文件。

二、使用第三方类库

zip的压缩和解压使用比较的有SharpZipLibDotNetZip

1、SharpZipLib,也称为“#ziplib”,基于GPL开源,支持Zip,GZip,Tar和BZip2的压缩和解压缩。

支持.NET 1.1,NET 2.0(3.5、4.0).

(1)zip压缩

  1. public static void Zip(string SrcFile, string DstFile, int BufferSize)
  2. {
  3. FileStream fileStreamIn = new FileStream
  4. (SrcFile, FileMode.Open, FileAccess.Read);
  5. FileStream fileStreamOut = new FileStream
  6. (DstFile, FileMode.Create, FileAccess.Write);
  7. ZipOutputStream zipOutStream = new ZipOutputStream(fileStreamOut);
  8. byte[] buffer = new byte<buffersize />;
  9. ZipEntry entry = new ZipEntry(Path.GetFileName(SrcFile));
  10. zipOutStream.PutNextEntry(entry);
  11. int size;
  12. do
  13. {
  14. size = fileStreamIn.Read(buffer, 0, buffer.Length);
  15. zipOutStream.Write(buffer, 0, size);
  16. } while (size > 0);
  17. zipOutStream.Close();
  18. fileStreamOut.Close();
  19. fileStreamIn.Close();
  20. }

(2)解压zip

  1. public static void UnZip(string SrcFile, string DstFile, int BufferSize)
  2. {
  3. FileStream fileStreamIn = new FileStream
  4. (SrcFile, FileMode.Open, FileAccess.Read);
  5. ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);
  6. ZipEntry entry = zipInStream.GetNextEntry();
  7. FileStream fileStreamOut = new FileStream
  8. (DstFile + @"\" + entry.Name, FileMode.Create, FileAccess.Write);
  9. int size;
  10. byte[] buffer = new byte<buffersize />;
  11. do
  12. {
  13. size = zipInStream.Read(buffer, 0, buffer.Length);
  14. fileStreamOut.Write(buffer, 0, size);
  15. } while (size > 0);
  16. zipInStream.Close();
  17. fileStreamOut.Close();
  18. fileStreamIn.Close();
  19. }

2、DotNetLib,是基于”WS-PL”开源,使用比较简单
     (1)压缩

  1. using (ZipFile zip = new ZipFile())
  2. {
  3. zip.AddFile("ReadMe.txt");
  4. zip.AddFile("7440-N49th.png");
  5. zip.AddFile("2008_Annual_Report.pdf");
  6. zip.Save("Archive.zip");
  7. }

(2)解压

  1. private void MyExtract()
  2. {
  3. string zipToUnpack = "C1P3SML.zip";
  4. string unpackDirectory = "Extracted Files";
  5. using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
  6. {
  7. // here, we extract every entry, but we could extract conditionally
  8. // based on entry name, size, date, checkbox status, etc.
  9. foreach (ZipEntry e in zip1)
  10. {
  11. e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
  12. }
  13. }
  14. }

三、在.NET 4.5使用ZipArchive、ZipFile等类压缩和解压

  1. static void Main(string[] args)
  2. {
  3. string ZipPath = @"c:\users\exampleuser\start.zip";
  4. string ExtractPath = @"c:\users\exampleuser\extract";
  5. string NewFile = @"c:\users\exampleuser\NewFile.txt";
  6.  
  7. using (ZipArchive Archive = ZipFile.Open(ZipPath, ZipArchiveMode.Update))
  8. {
  9. Archive.CreateEntryFromFile(NewFile, "NewEntry.txt");
  10. Archive.ExtractToDirectory(ExtractPath);
  11. }
  12. }

***************************/

博主本次用的压缩方法是引用了using Ionic.Zip;

下载地址http://dotnetzip.codeplex.com/

主要解决的问题就是压缩之后中文文件夹名称乱码

具体代码如下 :

  1. //待压缩的文件夹路径
  2. string path1 = @"D:\zhai\办公室";
  3. //System.Text.Encoding.Default解决中文文件夹名称乱码
  4. using (ZipFile zf = new ZipFile(System.Text.Encoding.Default))
  5. {
  6. zf.AddDirectory(path1);
  7. //压缩之后保存路径及压缩文件名
  8. zf.Save(@"D:\zhai\11.zip");
  9. }

.net文件压缩和解压及中文文件夹名称乱码问题的更多相关文章

  1. linux常用命令:4文件压缩和解压命令

    文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...

  2. Ionic.Zip.dll文件压缩和解压

    Ionic.Zip.dll文件压缩和解压 下载地址: http://download.csdn.net/detail/yfz19890410/5578515 1.下载Ionic.Zip.dll组件,添 ...

  3. c#自带压缩类实现的多文件压缩和解压

    用c#自带的System.IO.Compression命名空间下的压缩类实现的多文件压缩和解压功能,缺点是多文件压缩包的解压只能调用自身的解压方法,和现有的压缩软件不兼容.下面的代码没有把多文件的目录 ...

  4. java 文件压缩和解压(ZipInputStream, ZipOutputStream)

    最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...

  5. 文件压缩和解压 FileStream GZipStream

    using (FileStream reader=new FileStream (@"c:\1.txt",FileMode.Open,FileAccess.Read)) { usi ...

  6. C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用

    工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...

  7. python学习shutil模块的文件压缩和解压用法

    shutil模块可以创建压缩包并返回文件路径,例如 zip,tar,下面详细其用法 base_name 压缩包的文件名,也可以是压缩包的路径,只是文件名时,则保存至当前目录,否则保存指定路径 data ...

  8. java文件压缩和解压

    功能实现. package com.test; import java.io.File; import java.io.BufferedOutputStream; import java.io.Buf ...

  9. ZipArchive框架的文件压缩和解压

    导入第三方框架ZipArchive之后还要在系统库文件中导入一个如下文件(搜索libz出来的任何一个都可以)   导入的头文件是#import "Main.h" 文件压缩 -(vo ...

随机推荐

  1. c++ primer (5)2

    第三章 1.头文件不应包含using声明,因为头文件的内容会拷贝到所有引用它的文件中去. 2.初始化string对象的方式: string s1; //默认初始化,s1是一个空串 string s2( ...

  2. 高并发编程陷阱之check and set

    今天公司CTO跟隔壁部门开技术会,旁听了一下.所讲的内容感觉好高大上啊!简单记录一下 场景是这样的: if(check(id)===true) { }else{ set(id); } 什么意思呢? 就 ...

  3. Linux C 程序 数组(EIGHT)

    数组 1.一维数组的定义和使用,声明时数组默认值为0 int a[n]; 这样定义不合法,n是变量 ,数组规定[]里只能为常量 ] = {,,,,,,,,,}; a[] = {,} ;//部分赋值 , ...

  4. sql System.Data.SqlClient.SqlError: 无法覆盖文件 'C:\Program Files\Microsoft SQL Server\MSSQL\data\itsm_Data.MDF'。数据库 'my1' 正在使用该文件的解决方案

    对数据库备份进行还原时遇到“sql System.Data.SqlClient.SqlError: 无法覆盖文件 'C:\Program Files\Microsoft SQL Server\MSSQ ...

  5. 3d旋转--transform-style: preserve-3d,translate3d(x,y,z),perspective()

    transform-style: preserve-3d,translate3d(x,y,z),perspective() 让其倾斜的核心:加perspective(600px)让其动的核心:rans ...

  6. 纯原生js移动端城市选择插件

    接着上一篇纯js移动端日期选择插件,话说今天同事又来咨询省市县联动的效果在移动端中如何实现,还是老样子,百度上一搜,诶~又全是基于jquery.zepto的,更加可恨的是大多数都是PC版的,三个sel ...

  7. AngularJS(4)-服务(Service)

    1.$location服务 $location 服务,它可以返回当前页面的 URL 地址 2.$http服务 $http 是 AngularJS 应用中最常用的服务. 服务向服务器发送请求,应用响应服 ...

  8. 修改Sublime Text 3 的侧边栏字体大小

    此文转载哈,忘了作者地址,还请见谅!! 首先需要确保安装了Package ControlPackage Control作为ST必备插件,这里就不多介绍了,没装的话,google一下,各种介绍以及安装教 ...

  9. mirantis fuel 学习

    这些天看了mirantis中puppet的使用,对puppet的认识有了更深入的理解.mirantis公司的fuel主要是为了方便部署生产环境的openstack的工具.主要是在集群中自动化的安装op ...

  10. 基于Mahout的电影推荐系统

    基于Mahout的电影推荐系统 1.Mahout 简介 Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域 ...