asp.NET中实现文件的压缩和解压(3种方式)
在.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> ///AddafolderalongwithitssubfolderstoaPackage ///</summary> ///<paramname="folderName">Thefoldertoadd</param> ///<paramname="compressedFileName">Thepackagetocreate</param> ///<paramname="overrideExisting">Overrideexsisitngfiles</param> ///<returns></returns> staticboolPackageFolder(stringfolderName,stringcompressedFileName,booloverrideExisting) { if(folderName.EndsWith(@"\")) folderName=folderName.Remove(folderName.Length-1); boolresult=false; if(!Directory.Exists(folderName)) { returnresult; } if(!overrideExisting&&File.Exists(compressedFileName)) { returnresult; } try { using(Packagepackage=Package.Open(compressedFileName,FileMode.Create)) { varfileList=Directory.EnumerateFiles(folderName,"*",SearchOption.AllDirectories); foreach(stringfileNameinfileList) { //ThepathinthepackageisallofthesubfoldersafterfolderName stringpathInPackage; pathInPackage=Path.GetDirectoryName(fileName).Replace(folderName,string.Empty)+"/"+Path.GetFileName(fileName); UripartUriDocument=PackUriHelper.CreatePartUri(newUri(pathInPackage,UriKind.Relative)); PackagePartpackagePartDocument=package.CreatePart(partUriDocument,"",CompressionOption.Maximum); using(FileStreamfileStream=newFileStream(fileName,FileMode.Open,FileAccess.Read)) { fileStream.CopyTo(packagePartDocument.GetStream()); } } } result=true; } catch(Exceptione) { thrownewException("Errorzippingfolder"+folderName,e); } returnresult; }
2、将单个文件添加到zip文件中
///<summary> ///CompressafileintoaZIParchiveasthecontainerstore ///</summary> ///<paramname="fileName">Thefiletocompress</param> ///<paramname="compressedFileName">Thearchivefile</param> ///<paramname="overrideExisting">overrideexistingfile</param> ///<returns></returns> staticboolPackageFile(stringfileName,stringcompressedFileName,booloverrideExisting) { boolresult=false; if(!File.Exists(fileName)) { returnresult; } if(!overrideExisting&&File.Exists(compressedFileName)) { returnresult; } try { UripartUriDocument=PackUriHelper.CreatePartUri(newUri(Path.GetFileName(fileName),UriKind.Relative)); using(Packagepackage=Package.Open(compressedFileName,FileMode.OpenOrCreate)) { if(package.PartExists(partUriDocument)) { package.DeletePart(partUriDocument); } PackagePartpackagePartDocument=package.CreatePart(partUriDocument,"",CompressionOption.Maximum); using(FileStreamfileStream=newFileStream(fileName,FileMode.Open,FileAccess.Read)) { fileStream.CopyTo(packagePartDocument.GetStream()); } } result=true; } catch(Exceptione) { thrownewException("Errorzippingfile"+fileName,e); } returnresult; }
3、zip文件解压
///<summary> ///ExtractacontainerZip.NOTE:containermustbecreatedasOpenPackagingConventions(OPC)specification ///</summary> ///<paramname="folderName">Thefoldertoextractthepackageto</param> ///<paramname="compressedFileName">Thepackagefile</param> ///<paramname="overrideExisting">overrideexistingfiles</param> ///<returns></returns> staticboolUncompressFile(stringfolderName,stringcompressedFileName,booloverrideExisting) { boolresult=false; try { if(!File.Exists(compressedFileName)) { returnresult; } DirectoryInfodirectoryInfo=newDirectoryInfo(folderName); if(!directoryInfo.Exists) directoryInfo.Create(); using(Packagepackage=Package.Open(compressedFileName,FileMode.Open,FileAccess.Read)) { foreach(PackagePartpackagePartinpackage.GetParts()) { ExtractPart(packagePart,folderName,overrideExisting); } } result=true; } catch(Exceptione) { thrownewException("Errorunzippingfile"+compressedFileName,e); } returnresult; } staticvoidExtractPart(PackagePartpackagePart,stringtargetDirectory,booloverrideExisting) { stringstringPart=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(FileStreamfileStream=newFileStream(stringPart,FileMode.Create)) { packagePart.GetStream().CopyTo(fileStream); } }
使用Package压缩文件会在zip文件自动生成[Content_Type].xml,用来描述zip文件解压支持的文件格式。
<?xmlversion="1.0"encoding="utf-8"?> <Typesxmlns="http://schemas.openxmlformats.org/package/2006/content-types"> <DefaultExtension="vsixmanifest"ContentType="text/xml"/> <DefaultExtension="dll"ContentType="application/octet-stream"/> <DefaultExtension="png"ContentType="application/octet-stream"/> <DefaultExtension="txt"ContentType="text/plain"/> <DefaultExtension="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的压缩和解压缩。
支持.NET1.1,NET2.0(3.5、4.0).
(1)zip压缩
publicstaticvoidZip(stringSrcFile,stringDstFile,intBufferSize) { FileStreamfileStreamIn=newFileStream (SrcFile,FileMode.Open,FileAccess.Read); FileStreamfileStreamOut=newFileStream (DstFile,FileMode.Create,FileAccess.Write); ZipOutputStreamzipOutStream=newZipOutputStream(fileStreamOut); byte[]buffer=newbyte<buffersize/>; ZipEntryentry=newZipEntry(Path.GetFileName(SrcFile)); zipOutStream.PutNextEntry(entry); intsize; do { size=fileStreamIn.Read(buffer,0,buffer.Length); zipOutStream.Write(buffer,0,size); }while(size>0); zipOutStream.Close(); fileStreamOut.Close(); fileStreamIn.Close(); }
(2)解压zip
publicstaticvoidUnZip(stringSrcFile,stringDstFile,intBufferSize) { FileStreamfileStreamIn=newFileStream (SrcFile,FileMode.Open,FileAccess.Read); ZipInputStreamzipInStream=newZipInputStream(fileStreamIn); ZipEntryentry=zipInStream.GetNextEntry(); FileStreamfileStreamOut=newFileStream (DstFile+@"\"+entry.Name,FileMode.Create,FileAccess.Write); intsize; byte[]buffer=newbyte<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(ZipFilezip=newZipFile()) { zip.AddFile("ReadMe.txt"); zip.AddFile("7440-N49th.png"); zip.AddFile("2008_Annual_Report.pdf"); zip.Save("Archive.zip"); }
(2)解压
privatevoidMyExtract() { stringzipToUnpack="C1P3SML.zip"; stringunpackDirectory="ExtractedFiles"; using(ZipFilezip1=ZipFile.Read(zipToUnpack)) { //here,weextracteveryentry,butwecouldextractconditionally //basedonentryname,size,date,checkboxstatus,etc. foreach(ZipEntryeinzip1) { e.Extract(unpackDirectory,ExtractExistingFileAction.OverwriteSilently); } } }
三、在.NET4.5使用ZipArchive、ZipFile等类压缩和解压
staticvoidMain(string[]args) { stringZipPath=@"c:\users\exampleuser\start.zip"; stringExtractPath=@"c:\users\exampleuser\extract"; stringNewFile=@"c:\users\exampleuser\NewFile.txt"; using(ZipArchiveArchive=ZipFile.Open(ZipPath,ZipArchiveMode.Update)) { Archive.CreateEntryFromFile(NewFile,"NewEntry.txt"); Archive.ExtractToDirectory(ExtractPath); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。