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);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。