在.NET可以透過多種方式實現的zip的壓縮和解壓:1,使用System.IO.Packaging程式; 2,使用第三方類別庫; 3,透過System.IO.Compression命名空間中新增的ZipArchive ,的ZipFile類等實現
一,使用System.IO.Packaging程序壓縮和解壓
包為一個抽象類,可用於將對象組織到定義的物理格式的單個實體中,從而實現高效性與存取.ZIP檔案是包的主物理格式。其他套餐實作可以使用其他物理格式(如XML文檔,資料庫或Web服務。與文件系統類似,在分層組織的資料夾和文件中引用包中包含的項目。雖然包裝是抽象類,但Package.Open方法預設使用ZipPackage衍生類別。
///新增一個資料夾及其子資料夾一個包沿著
/// 摘要>
/// 建立套件 param>
/// 覆蓋exsisitng檔案 param> PackageFolder(字串資料夾名,字串compressedFileName,布林overrideExisting)
{
FOLDERNAME = folderName.Remove(folderName.Length - 1);
布林結果= FALSE;
如果(Directory.Exists(文件夾名)!)
{
返回結果;
}
(!overrideExisting && File.Exists(compressedFileName))如果
{
返回結果;
}
嘗試
{
使用(套餐包= Package.Open(compressedFileName,FileMode.Create))
{
“*”,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檔案作為容器店
/// 摘要>
=“compressedFileName” >歸檔檔案 param>
/// 覆寫現有檔案 param>
compressedFileName,布林overrideExisting)
{
布林結果= FALSE; )
{
返回結果;
}
(!overrideExisting && File.Exists(compressedFileName))如果
{
返回結果;
}
嘗試
{
烏里partUriDocument = PackUriHelper.CreatePartUri(新的URI(Path .GetFileName(檔案名稱),UriKind.Relative));
使用(套餐包= Package.Open(compressedFileName,FileMode.OpenOrCreate))
{ Document))
{
}
partUriDocument,“”,CompressionOption.Maximum);
{
}
}
{
為新的例外(「錯誤壓縮與解文件」+檔案名,E);
回傳結果;
} 3,且壓縮文件解壓縮
代碼///
///提取物的容器郵編。附註:容器必須建立為開放式打包約定(OPC)規格
/// 摘要>
/// 包裝檔案 param>
/// 覆現有檔案 param>
檔案夾名,字串compressedFileName,布林overrideExisting)
{
{
若的(File.Exists(compressedFileName)!) 回傳結果;
}
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)
{ p. Part.Uri.ToString())更換('\','/')。
如果(Directory.Exists(Path.GetDirectoryName(stringPart))!)
若(!overrideExisting && File.Exists(stringPart))
的FileStream FILESTREAM =新的FileStream(stringPart,FileMode.Create))
{
Sharp
代碼
“DLL”的ContentType =“應用程式/八位元組-stream“/>
類型>同樣,如果壓縮檔案不包含[內容]的.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 fileStreamOut =新的FileStream
(DstFile,FileMode.Create,FileAccess.Write);
ZipOutputStream zipOutStream =新ZipOutumStream(StreamOut);入門的ZipEntry =新的ZipEntry(Path.GetFileName(SRCFILE));
zipOutStream.PutNextEntry(輸入);
INT fileStreamIn.Read(緩衝,0,buffer.Length);
zipOutStream .Write(緩衝液,0,大小);
}而(大小> 0);
zipOutStream.Close();
fileStreamOut.Close();的解壓縮(字串SRCFILE,串聯DstFile,INT緩衝區大小)
{
的FileStream fileStreamIn =新的FileStream
(SRCFILE,FileMode.Open,FileAccess.Read);In
(SRCFILE,File ZipEntry的條目= zipInStream.GetNextEntry();
的FileStream fileStreamOut =新的FileStream
(DstFile + @“”+ entry.Name,FileMode.Create,FileAccess.Write); INT 新位元組;
做
{
大小= zipInStream.Read(緩衝,0,buffer.Length) }而(大小> 0 );
zipInStream.Close();
fileStreamOut.Close();
fileStreamIn.Close();
} 2,DotNetLib,是基於「使用比PL」使用元件來比較系統(系統使用比對” ZipFile =新的ZipFile())
{
zip.AddFile(的「readme.txt」);
zip.AddFile(「7440-N09th.
zip.Save(「Archive.zip」);
}(2)解壓縮Codeprivate無效MyExtract()
{
使用(ZIP1使用ZipFile = ZipFile.Read(zipToUnpack))
{
//這裡,且我們擷取的每個項目,但任何條件 的foreach }(ZipEntry的E在ZIP1)
{
}
}
三,且.NET 4.5使用ZipArchive,的ZipFile等類別壓縮和解靜態無效的主要(字符串[] args)
{
ampleuser 萃取物”;
字串NEWFILE = @「C:使用者exampleuser NewFile.txt」
使用(ZipArchive存檔= ZipFile.Open(ZipPath Archive.CreateEntryFromFile(NEWFILE「NewEntry.txt」);
txt」);
ExtractToDirectory(ExtractPath);
}
}