.NET中的zip的壓縮和解壓
來源:互聯網
上載者:User
在.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);
}
}