.NET中的zip的压缩和解压

企鹅博客
19500
文章
0
评论
2019年12月30日03:07:25 评论 83 views 5830字阅读19分26秒

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

一,使用System.IO.Packaging程序压缩和解压

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

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

1,将整个文件夹压缩成压缩

代码/// <摘要>

///添加一个文件夹及其子文件夹一个包沿着

/// </摘要>

/// <param名=“文件夹名”>添加文件夹</ param>

/// <param name =“compressedFileName”>创建包</ param>

/// <param name =“overrideExisting”>覆盖exsisitng文件</ param>

/// <返回> </回报>

静态布尔PackageFolder(字符串文件夹名,字符串compressedFileName,布尔overrideExisting)

{

如果(folderName.EndsWith(@“\”))

FOLDERNAME = folderName.Remove(folderName.Length - 1);

布尔结果= FALSE;

如果(Directory.Exists(文件夹名)!)

{

返回结果;

}

(!overrideExisting && File.Exists(compressedFileName))如果

{

返回结果;

}

尝试

{

使用(套餐包= Package.Open(compressedFileName,FileMode.Create))

{

VAR的fileList = Directory.EnumerateFiles(文件夹名,“*”,SearchOption.AllDirectories);

的foreach(在的fileList字符串文件名)

{

//包中的路径是所有文件夹名后的子文件夹

弦pathInPackage;

pathInPackage = Path.GetDirectoryName(文件名).Replace(文件夹名,的String.Empty)+“/”+ Path.GetFileName(文件名);

乌里partUriDocument = PackUriHelper.CreatePartUri(新的URI(pathInPackage,UriKind.Relative));

的PackagePart packagePartDocument = package.CreatePart(partUriDocument,“”,CompressionOption.Maximum);

使用(的FileStream FILESTREAM =新的FileStream(文件名,FileMode.Open,FileAccess.Read))

{

fileStream.CopyTo(packagePartDocument.GetStream());

}

}

}

结果=真;

}

赶上(例外五)

{

抛出新的异常(“错误荏苒文件夹”文件夹名+,E);

}

返回结果;

}

2,将单个文件添加到压缩文件中

的代码/// <摘要>

///压缩文件成ZIP文件作为容器店

/// </摘要>

/// <param name =“文件名”>文件压缩</ param>

/// <param name =“compressedFileName”>归档文件</ param>

/// <param name =“overrideExisting”>覆盖现有文件</ param>

/// <返回> </回报>

静态布尔PackageFile(字符串文件名,字符串compressedFileName,布尔overrideExisting)

{

布尔结果= FALSE;

如果(File.Exists(文件名)!)

{

返回结果;

}

(!overrideExisting && File.Exists(compressedFileName))如果

{

返回结果;

}

尝试

{

乌里partUriDocument = PackUriHelper.CreatePartUri(新的URI(Path.GetFileName(文件名),UriKind.Relative));

使用(套餐包= Package.Open(compressedFileName,FileMode.OpenOrCreate))

{

如果(package.PartExists(partUriDocument))

{

package.DeletePart(partUriDocument);

}

的PackagePart packagePartDocument = package.CreatePart(partUriDocument,“”,CompressionOption.Maximum);

使用(的FileStream FILESTREAM =新的FileStream(文件名,FileMode.Open,FileAccess.Read))

{

fileStream.CopyTo(packagePartDocument.GetStream());

}

}

结果=真;

}

赶上(例外五)

{

抛出新的异常(“错误压缩和解文件”+文件名,E);

}

返回结果;

} 3,压缩文件解压

代码/// <摘要>

///提取物的容器邮编。注:容器必须创建为开放式打包约定(OPC)规范

/// </摘要>

/// <param name =“文件夹名称”>文件夹解压包</ param>

/// <param name = “compressedFileName”>包文件</ param>

/// <param name =“overrideExisting”>覆盖现有文件</ param>

/// <返回> </回报>

静态布尔UncompressFile(字符串文件夹名,字符串compressedFileName,布尔overrideExisting)

{

布尔结果= FALSE;

尝试

{

如果(File.Exists(compressedFileName)!)

{

返回结果;

}

的DirectoryInfo DirectoryInfo的=新DirectoryInfo的(文件夹名);

如果(!directoryInfo.Exists)

directoryInfo.Create();

使用(套餐包= Package.Open(compressedFileName,FileMode.Open,FileAccess.Read))

{

的foreach(的PackagePart的PackagePart在package.GetParts())

{

ExtractPart(的PackagePart,文件夹名,overrideExisting);

}

}

结果=真;

}

赶上(例外五)

{

抛出新的异常(“错误解压缩文件”+ compressedFileName,E);

}

返回结果;

}

静态无效ExtractPart(的PackagePart的PackagePart,串targetdirectory中,布尔overrideExisting)

{

字符串stringPart = targetdirectory中+ HttpUtility.UrlDecode(packagePart.Uri.ToString())更换('\\','/')。

如果(Directory.Exists(Path.GetDirectoryName(stringPart))!)

Directory.CreateDirectory(Path.GetDirectoryName(stringPart));

如果(!overrideExisting && File.Exists(stringPart))

回报;

使用(的FileStream FILESTREAM =新的FileStream(stringPart,FileMode.Create))

{

packagePart.GetStream()CopyTo从(FILESTREAM)。

}

}

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

代码<?XML版本=“1.0”编码=“UTF-8”?>

<类型的xmlns =“http://schemas.openxmlformats.org/package/2006/content-types”>

<默认扩展=“vsixmanifest”的ContentType =“文本/ XML”/>

<默认扩展=“DLL”的ContentType =“应用程序/八位字节-stream“/>

<默认扩展=”PNG“的ContentType =”应用程序/八位字节流“/>

<默认扩展=”TXT“的ContentType =”text / plain的“/>

<默认扩展=”pkgdef“的ContentType =”TEXT /平原“/>

</类型>同样,如果压缩文件不包含[内容]的.xml文件,或者[内容]的.xml文件不包含所对应扩展名的描述(手动添加的[内容]的.xml也是可以) ,将无法解压文件。二,使用第三方类库压缩的压缩和解压使用比较的有SharpZipLib和DotNetZip。

1,SharpZipLib,也称为“#ziplib”,基于GPL开源,支持ZIP,GZIP在内焦油和BZip2压缩的压缩和解压缩。

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

(1)ZIP压缩

Codepublic静态无效的邮编(字符串SRCFILE,串DstFile,INT缓冲区大小)

{

的FileStream fileStreamIn =新的FileStream

(SRCFILE,FileMode.Open,FileAccess.Read);

的FileStream fileStreamOut =新的FileStream

(DstFile,FileMode.Create,FileAccess.Write);

ZipOutputStream zipOutStream =新ZipOutputStream(fileStreamOut);

字节[]缓冲区=新字节<缓冲区大小/>;

入门的ZipEntry =新的ZipEntry(Path.GetFileName(SRCFILE));

zipOutStream.PutNextEntry(输入);

INT大小;



{

大小= fileStreamIn.Read(缓冲,0,buffer.Length);

zipOutStream.Write(缓冲液,0,大小);

}而(大小> 0);

zipOutStream.Close();

fileStreamOut.Close();

fileStreamIn.Close();

}(2)解压zipCodepublic静态无效的解压(字符串SRCFILE,串DstFile,INT缓冲区大小)

{

的FileStream fileStreamIn =新的FileStream

(SRCFILE,FileMode.Open,FileAccess.Read);

ZipInputStream zipInStream =新ZipInputStream(fileStreamIn);

ZipEntry的条目= zipInStream.GetNextEntry();

的FileStream fileStreamOut =新的FileStream

(DstFile + @“\”+ entry.Name,FileMode.Create,FileAccess.Write);

INT大小;

字节[]缓冲区=新字节<缓冲区大小/>;



{

大小= zipInStream.Read(缓冲,0,buffer.Length);

fileStreamOut.Write(缓冲液,0,大小);

}而(大小> 0);

zipInStream.Close();

fileStreamOut.Close();

fileStreamIn.Close();

} 2,DotNetLib,是基于“WS-PL”开源,使用比较简单(1)压缩代码使用(拉链使用ZipFile =新的ZipFile())

{

zip.AddFile(的“readme.txt”);

zip.AddFile(“7440-N49th.png”);

zip.AddFile(“2008_Annual_Report.pdf”);

zip.Save(“Archive.zip”);

}(2)解压Codeprivate无效MyExtract()

{

字符串zipToUnpack =“C1P3SML.zip”;

字符串unpackDirectory =“解压缩文件”;

使用(ZIP1使用ZipFile = ZipFile.Read(zipToUnpack))

{

//这里,我们提取的每个条目,但我们可以有条件地提取

根据条目名称,大小,日期,复选框状态等//

的foreach(ZipEntry的E在ZIP1)

{

e.Extract(unpackDirectory,ExtractExistingFileAction.OverwriteSilently);

}

}

}

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

代码静态无效的主要(字串[] args)

{

字符串ZipPath = @“C:\用户\ exampleuser \ start.zip”

字符串ExtractPath = @“C:\用户\ exampleuser \提取物”;

字符串NEWFILE = @“C:\用户\ exampleuser \ NewFile.txt”

使用(ZipArchive存档= ZipFile.Open(ZipPath,ZipArchiveMode.Update))

{

Archive.CreateEntryFromFile(NEWFILE“NewEntry.txt”);

Archive.ExtractToDirectory(ExtractPath);

}

}

继续阅读
  • 版权声明: 发表于 2019年12月30日03:07:25
  • 转载注明:https://www.qieseo.com/323737.html
.net逻辑分层架构总结 C#.Net教程

.net逻辑分层架构总结

一.基础知识准备:   1.层的原则:   (1)每一层以接口方式供上层调用。  (2)上层只能调用下层。  (3)依赖分为松散交互和严格交互两种。   2.业务逻辑分类:   (1)应用逻辑。  (...
.net core使用Redis发布订阅方法介绍 C#.Net教程

.net core使用Redis发布订阅方法介绍

本篇文章主要介绍了.net core如何使用Redis发布订阅,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来...
总结一些编码和设计原则实例 C#.Net教程

总结一些编码和设计原则实例

本章介绍了本书其它部分未涉及到的一些编码和设计原则。包含了一些.NET的应用场景,有些不会造成太大危害,有些则会造成明显的问题。剩下的则根据你的使用方法会产生不同的效果。如果要对本章节出现的原则做一个...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: