.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);
}
}
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.