.net文件压缩和解压及中文文件夹名称乱码问题
/**************************注释区域内为引用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
- /// <summary>
- /// Add a folder along with its subfolders to a Package
- /// </summary>
- /// <param name="folderName">The folder to add</param>
- /// <param name="compressedFileName">The package to create</param>
- /// <param name="overrideExisting">Override exsisitng files</param>
- /// <returns></returns>
- static bool PackageFolder(string folderName, string compressedFileName, bool overrideExisting)
- {
- if (folderName.EndsWith(@"\"))
- folderName = folderName.Remove(folderName.Length - 1);
- bool result = false;
- if (!Directory.Exists(folderName))
- {
- return result;
- }
- if (!overrideExisting && File.Exists(compressedFileName))
- {
- return result;
- }
- try
- {
- using (Package package = Package.Open(compressedFileName, FileMode.Create))
- {
- var fileList = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
- foreach (string fileName in fileList)
- {
- //The path in the package is all of the subfolders after folderName
- string pathInPackage;
- pathInPackage = Path.GetDirectoryName(fileName).Replace(folderName, string.Empty) + "/" + Path.GetFileName(fileName);
- Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(pathInPackage, UriKind.Relative));
- PackagePart packagePartDocument = package.CreatePart(partUriDocument,"", CompressionOption.Maximum);
- using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
- {
- fileStream.CopyTo(packagePartDocument.GetStream());
- }
- }
- }
- result = true;
- }
- catch (Exception e)
- {
- throw new Exception("Error zipping folder " + folderName, e);
- }
- return result;
- }
2、将单个文件添加到zip文件中
- /// <summary>
- /// Compress a file into a ZIP archive as the container store
- /// </summary>
- /// <param name="fileName">The file to compress</param>
- /// <param name="compressedFileName">The archive file</param>
- /// <param name="overrideExisting">override existing file</param>
- /// <returns></returns>
- static bool PackageFile(string fileName, string compressedFileName, bool overrideExisting)
- {
- bool result = false;
- if (!File.Exists(fileName))
- {
- return result;
- }
- if (!overrideExisting && File.Exists(compressedFileName))
- {
- return result;
- }
- try
- {
- Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(Path.GetFileName(fileName), UriKind.Relative));
- using (Package package = Package.Open(compressedFileName, FileMode.OpenOrCreate))
- {
- if (package.PartExists(partUriDocument))
- {
- package.DeletePart(partUriDocument);
- }
- PackagePart packagePartDocument = package.CreatePart(partUriDocument, "", CompressionOption.Maximum);
- using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
- {
- fileStream.CopyTo(packagePartDocument.GetStream());
- }
- }
- result = true;
- }
- catch (Exception e)
- {
- throw new Exception("Error zipping file " + fileName, e);
- }
- return result;
- }
3、zip文件解压
- /// <summary>
- /// Extract a container Zip. NOTE: container must be created as Open Packaging Conventions (OPC) specification
- /// </summary>
- /// <param name="folderName">The folder to extract the package to</param>
- /// <param name="compressedFileName">The package file</param>
- /// <param name="overrideExisting">override existing files</param>
- /// <returns></returns>
- static bool UncompressFile(string folderName, string compressedFileName, bool overrideExisting)
- {
- bool result = false;
- try
- {
- if (!File.Exists(compressedFileName))
- {
- return result;
- }
- DirectoryInfo directoryInfo = new DirectoryInfo(folderName);
- if (!directoryInfo.Exists)
- directoryInfo.Create();
- using (Package package = Package.Open(compressedFileName, FileMode.Open, FileAccess.Read))
- {
- foreach (PackagePart packagePart in package.GetParts())
- {
- ExtractPart(packagePart, folderName, overrideExisting);
- }
- }
- result = true;
- }
- catch (Exception e)
- {
- throw new Exception("Error unzipping file " + compressedFileName, e);
- }
- return result;
- }
- static void ExtractPart(PackagePart packagePart, string targetDirectory, bool overrideExisting)
- {
- string stringPart = targetDirectory + HttpUtility.UrlDecode(packagePart.Uri.ToString()).Replace('\\', '/');
- if (!Directory.Exists(Path.GetDirectoryName(stringPart)))
- Directory.CreateDirectory(Path.GetDirectoryName(stringPart));
- if (!overrideExisting && File.Exists(stringPart))
- return;
- using (FileStream fileStream = new FileStream(stringPart, FileMode.Create))
- {
- packagePart.GetStream().CopyTo(fileStream);
- }
- }
使用Package压缩文件会在zip文件自动生成[Content_Type].xml,用来描述zip文件解压支持的文件格式。
- <?xml version="1.0" encoding="utf-8" ?>
- <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
- <Default Extension="vsixmanifest" ContentType="text/xml" />
- <Default Extension="dll" ContentType="application/octet-stream" />
- <Default Extension="png" ContentType="application/octet-stream" />
- <Default Extension="txt" ContentType="text/plain" />
- <Default Extension="pkgdef" ContentType="text/plain" />
- </Types>
同样,如果zip文件不包含[Content_Type].xml文件,或者[Content_Type].xml文件不包含所对应扩展名的描述(手动添加的[Content_Type].xml也是可以),将无法解压文件。
二、使用第三方类库
zip的压缩和解压使用比较的有SharpZipLib和DotNetZip。
1、SharpZipLib,也称为“#ziplib”,基于GPL开源,支持Zip,GZip,Tar和BZip2的压缩和解压缩。
支持.NET 1.1,NET 2.0(3.5、4.0).
(1)zip压缩
- public static void Zip(string SrcFile, string DstFile, int BufferSize)
- {
- FileStream fileStreamIn = new FileStream
- (SrcFile, FileMode.Open, FileAccess.Read);
- FileStream fileStreamOut = new FileStream
- (DstFile, FileMode.Create, FileAccess.Write);
- ZipOutputStream zipOutStream = new ZipOutputStream(fileStreamOut);
- byte[] buffer = new byte<buffersize />;
- ZipEntry entry = new ZipEntry(Path.GetFileName(SrcFile));
- zipOutStream.PutNextEntry(entry);
- int size;
- do
- {
- size = fileStreamIn.Read(buffer, 0, buffer.Length);
- zipOutStream.Write(buffer, 0, size);
- } while (size > 0);
- zipOutStream.Close();
- fileStreamOut.Close();
- fileStreamIn.Close();
- }
(2)解压zip
- public static void UnZip(string SrcFile, string DstFile, int BufferSize)
- {
- FileStream fileStreamIn = new FileStream
- (SrcFile, FileMode.Open, FileAccess.Read);
- ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);
- ZipEntry entry = zipInStream.GetNextEntry();
- FileStream fileStreamOut = new FileStream
- (DstFile + @"\" + entry.Name, FileMode.Create, FileAccess.Write);
- int size;
- byte[] buffer = new byte<buffersize />;
- do
- {
- size = zipInStream.Read(buffer, 0, buffer.Length);
- fileStreamOut.Write(buffer, 0, size);
- } while (size > 0);
- zipInStream.Close();
- fileStreamOut.Close();
- fileStreamIn.Close();
- }
2、DotNetLib,是基于”WS-PL”开源,使用比较简单
(1)压缩
- using (ZipFile zip = new ZipFile())
- {
- zip.AddFile("ReadMe.txt");
- zip.AddFile("7440-N49th.png");
- zip.AddFile("2008_Annual_Report.pdf");
- zip.Save("Archive.zip");
- }
(2)解压
- private void MyExtract()
- {
- string zipToUnpack = "C1P3SML.zip";
- string unpackDirectory = "Extracted Files";
- using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
- {
- // here, we extract every entry, but we could extract conditionally
- // based on entry name, size, date, checkbox status, etc.
- foreach (ZipEntry e in zip1)
- {
- e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
- }
- }
- }
三、在.NET 4.5使用ZipArchive、ZipFile等类压缩和解压
- static void Main(string[] args)
- {
- string ZipPath = @"c:\users\exampleuser\start.zip";
- string ExtractPath = @"c:\users\exampleuser\extract";
- string NewFile = @"c:\users\exampleuser\NewFile.txt";
- using (ZipArchive Archive = ZipFile.Open(ZipPath, ZipArchiveMode.Update))
- {
- Archive.CreateEntryFromFile(NewFile, "NewEntry.txt");
- Archive.ExtractToDirectory(ExtractPath);
- }
- }
***************************/
博主本次用的压缩方法是引用了using Ionic.Zip;
下载地址http://dotnetzip.codeplex.com/
主要解决的问题就是压缩之后中文文件夹名称乱码
具体代码如下 :
- //待压缩的文件夹路径
- string path1 = @"D:\zhai\办公室";
- //System.Text.Encoding.Default解决中文文件夹名称乱码
- using (ZipFile zf = new ZipFile(System.Text.Encoding.Default))
- {
- zf.AddDirectory(path1);
- //压缩之后保存路径及压缩文件名
- zf.Save(@"D:\zhai\11.zip");
- }
.net文件压缩和解压及中文文件夹名称乱码问题的更多相关文章
- linux常用命令:4文件压缩和解压命令
文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...
- Ionic.Zip.dll文件压缩和解压
Ionic.Zip.dll文件压缩和解压 下载地址: http://download.csdn.net/detail/yfz19890410/5578515 1.下载Ionic.Zip.dll组件,添 ...
- c#自带压缩类实现的多文件压缩和解压
用c#自带的System.IO.Compression命名空间下的压缩类实现的多文件压缩和解压功能,缺点是多文件压缩包的解压只能调用自身的解压方法,和现有的压缩软件不兼容.下面的代码没有把多文件的目录 ...
- java 文件压缩和解压(ZipInputStream, ZipOutputStream)
最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...
- 文件压缩和解压 FileStream GZipStream
using (FileStream reader=new FileStream (@"c:\1.txt",FileMode.Open,FileAccess.Read)) { usi ...
- C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用
工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...
- python学习shutil模块的文件压缩和解压用法
shutil模块可以创建压缩包并返回文件路径,例如 zip,tar,下面详细其用法 base_name 压缩包的文件名,也可以是压缩包的路径,只是文件名时,则保存至当前目录,否则保存指定路径 data ...
- java文件压缩和解压
功能实现. package com.test; import java.io.File; import java.io.BufferedOutputStream; import java.io.Buf ...
- ZipArchive框架的文件压缩和解压
导入第三方框架ZipArchive之后还要在系统库文件中导入一个如下文件(搜索libz出来的任何一个都可以) 导入的头文件是#import "Main.h" 文件压缩 -(vo ...
随机推荐
- c++ primer (5)2
第三章 1.头文件不应包含using声明,因为头文件的内容会拷贝到所有引用它的文件中去. 2.初始化string对象的方式: string s1; //默认初始化,s1是一个空串 string s2( ...
- 高并发编程陷阱之check and set
今天公司CTO跟隔壁部门开技术会,旁听了一下.所讲的内容感觉好高大上啊!简单记录一下 场景是这样的: if(check(id)===true) { }else{ set(id); } 什么意思呢? 就 ...
- Linux C 程序 数组(EIGHT)
数组 1.一维数组的定义和使用,声明时数组默认值为0 int a[n]; 这样定义不合法,n是变量 ,数组规定[]里只能为常量 ] = {,,,,,,,,,}; a[] = {,} ;//部分赋值 , ...
- 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 ...
- 3d旋转--transform-style: preserve-3d,translate3d(x,y,z),perspective()
transform-style: preserve-3d,translate3d(x,y,z),perspective() 让其倾斜的核心:加perspective(600px)让其动的核心:rans ...
- 纯原生js移动端城市选择插件
接着上一篇纯js移动端日期选择插件,话说今天同事又来咨询省市县联动的效果在移动端中如何实现,还是老样子,百度上一搜,诶~又全是基于jquery.zepto的,更加可恨的是大多数都是PC版的,三个sel ...
- AngularJS(4)-服务(Service)
1.$location服务 $location 服务,它可以返回当前页面的 URL 地址 2.$http服务 $http 是 AngularJS 应用中最常用的服务. 服务向服务器发送请求,应用响应服 ...
- 修改Sublime Text 3 的侧边栏字体大小
此文转载哈,忘了作者地址,还请见谅!! 首先需要确保安装了Package ControlPackage Control作为ST必备插件,这里就不多介绍了,没装的话,google一下,各种介绍以及安装教 ...
- mirantis fuel 学习
这些天看了mirantis中puppet的使用,对puppet的认识有了更深入的理解.mirantis公司的fuel主要是为了方便部署生产环境的openstack的工具.主要是在集群中自动化的安装op ...
- 基于Mahout的电影推荐系统
基于Mahout的电影推荐系统 1.Mahout 简介 Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域 ...