Sharpziplib 提取 ZIP C#(對於開發者的運行原理)
在現今的數位環境中,資料管理是最重要的,因此擁有有效率的壓縮與解壓縮工具至關重要。 SharpZipLib就是這樣一個在 .NET 生態系統中脫穎而出的工具。 在這篇文章中,我們將深入探討 SharpZipLib,探索它的功能、應用以及如何將它整合到您的 .NET 專案中。
什麼是 SharpZipLib?
SharpZipLib 是一個功能豐富的 .NET 開源壓縮函式庫,完全以 C# 寫成。 它提供了對各種壓縮格式的全面支援,包括 ZIP、GZip 和 Tar。 SharpZipLib 由一個熱心的社群所開發,提供廣泛的功能來有效率地壓縮與解壓縮檔案。
特色與功能
1.支援多種壓縮格式: SharpZipLib 支援 ZIP、GZip 和 Tar 等熱門壓縮格式,滿足各種使用情況和需求。 2.以流為基礎的作業:這個函式庫以流為作業基礎,讓開發人員可以處理來自檔案、記憶體流或網路流等各種來源的資料。 這種靈活性有助於無縫整合到應用程式的不同部分。 3.壓縮層級: 開發人員可根據其特定需求微調壓縮層級,以平衡壓縮比率與處理速度。 4.密碼保護: SharpZipLib 允許建立受密碼保護的 ZIP 存檔,透過使用指定密碼加密內容來確保資料安全。 5.錯誤處理與復原:強大的錯誤處理機制可讓開發人員在壓縮與解壓縮作業期間優雅地處理異常。 此外,SharpZipLib 支援從損毀的歸檔中復原,提高了可靠性。
使用案例
1.檔案壓縮與歸檔: SharpZipLib 是需要壓縮與歸檔檔案的應用程式的理想選擇,例如備份公用程式、檔案管理工具或資料匯出功能。 2.網路服務與 API:處理檔案傳輸或資料交換的網路服務通常會從壓縮中獲益,以減少頻寬的使用。 SharpZipLib 可以無縫整合到這些服務中,以有效率地壓縮輸出的資料或解壓縮輸入的有效負載。 3.桌面應用程式:處理大型資料集或資源檔案的桌面應用程式可以利用 SharpZipLib 來壓縮檔案,以便儲存或散佈。 這對軟體安裝程式或資料同步工具尤其有用。 4.資料備份與儲存:需要定期備份或以壓縮格式儲存資料的應用程式,可以使用 SharpZipLib 自動執行備份程序,並有效節省儲存空間。
SharpZipLib 的優點
1.開放原始碼:身為一個開放原始碼的函式庫,SharpZipLib 鼓勵合作與社群貢獻,以確保持續的改進與適應不斷演進的需求。 2.跨平台相容性: SharpZipLib 由 C# 寫成,以 .NET Framework 為目標,相容於各種平台,包括 Windows、Linux 和 macOS,增強了其通用性。 3.輕量且高效: SharpZipLib 的設計是為了輕量且高效,在提供高效能壓縮和解壓縮功能的同時,將資源消耗降至最低。 4.廣泛的文件和支援:全面的文件和社群支援讓開發人員在使用 SharpZipLib 時更容易整合和排除故障。
建立 C# Visual Studio 專案
1.開啟 Visual Studio 並點選"建立新專案"選項。 2.根據您的需求選擇適當的專案範本 (例如:主控台應用程式、Windows 表單應用程式)。
。
3.指定專案名稱和位置,然後按一下"下一步"。

4.從附加資訊中選擇最新的 .NET Framework。 按一下"建立"以建立專案。
安裝流程
要將 SharpZipLib 整合到您的 .NET 專案中:
1.在您的 Visual Studio IDE C# ConsoleApp 中,在 Solution Explorer 中的專案上按一下滑鼠右鍵,然後選擇 "Manage NuGet Packages..."。 2.在 NuGet Package Manager 視窗中,搜尋 "SharpZipLib"。

3.從搜尋結果中選擇"SharpZipLib",然後按一下"安裝"按鈕。 4.NuGet 會自動下載並將必要的相依性加入您的專案。
程式碼範例
以下是一個簡化的範例,示範如何使用 SharpZipLib 來壓縮和解壓縮檔案:
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.IO;
namespace SharpZipLibExample
{
class Program
{
static void Main(string[] args)
{
string sourceDirectory = @"C:\SourceDirectory"; // Source directory containing files to compress
string zipFilePath = @"C:\OutputDirectory\compressed.zip"; // Output path for the compressed ZIP file
// Compress files from the source directory
CompressDirectory(sourceDirectory, zipFilePath);
Console.WriteLine("Files compressed successfully.");
string extractPath = @"C:\OutputDirectory\extracted"; // Path to extract the decompressed files
// Decompress files from the ZIP archive
Decompress(zipFilePath, extractPath);
Console.WriteLine("Files decompressed successfully.");
}
// Method to compress all files in a directory to a ZIP file
static void CompressDirectory(string sourceDirectory, string zipFilePath)
{
using (var zipOutputStream = new ZipOutputStream(File.Create(zipFilePath)))
{
zipOutputStream.SetLevel(5); // Set compression level (0-9), 5 as a mid-range
// Recursively add files in the source directory to the ZIP file
AddDirectoryFilesToZip(sourceDirectory, zipOutputStream);
zipOutputStream.Finish();
zipOutputStream.Close();
}
}
// Method to add files from a directory to a ZIP output stream
static void AddDirectoryFilesToZip(string sourceDirectory, ZipOutputStream zipOutputStream)
{
// Get list of files in the directory
string[] files = Directory.GetFiles(sourceDirectory);
foreach (string file in files)
{
var entry = new ZipEntry(Path.GetFileName(file)); // Create a new entry for each file
zipOutputStream.PutNextEntry(entry);
using (var fileStream = File.OpenRead(file))
{
// Buffer for reading files
byte[] buffer = new byte[4096];
int sourceBytes;
// Read file and write to ZIP stream
while ((sourceBytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
zipOutputStream.Write(buffer, 0, sourceBytes);
}
}
}
// Handle subdirectories recursively
string[] subdirectories = Directory.GetDirectories(sourceDirectory);
foreach (string subdirectory in subdirectories)
{
AddDirectoryFilesToZip(subdirectory, zipOutputStream);
}
}
// Method to decompress files from a ZIP file
static void Decompress(string zipFilePath, string extractPath)
{
using (var zipInputStream = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry entry;
// Read entries from the ZIP archive
while ((entry = zipInputStream.GetNextEntry()) != null)
{
string entryPath = Path.Combine(extractPath, entry.Name);
// Process files
if (entry.IsFile)
{
string directoryName = Path.GetDirectoryName(entryPath);
if (!Directory.Exists(directoryName))
Directory.CreateDirectory(directoryName);
using (var fileStream = File.Create(entryPath))
{
// Buffer for reading entries
byte[] buffer = new byte[4096];
int bytesRead;
// Read from ZIP stream and write to file
while ((bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, bytesRead);
}
}
}
else if (entry.IsDirectory) // Process directories
{
Directory.CreateDirectory(entryPath);
}
}
}
}
}
}
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.IO;
namespace SharpZipLibExample
{
class Program
{
static void Main(string[] args)
{
string sourceDirectory = @"C:\SourceDirectory"; // Source directory containing files to compress
string zipFilePath = @"C:\OutputDirectory\compressed.zip"; // Output path for the compressed ZIP file
// Compress files from the source directory
CompressDirectory(sourceDirectory, zipFilePath);
Console.WriteLine("Files compressed successfully.");
string extractPath = @"C:\OutputDirectory\extracted"; // Path to extract the decompressed files
// Decompress files from the ZIP archive
Decompress(zipFilePath, extractPath);
Console.WriteLine("Files decompressed successfully.");
}
// Method to compress all files in a directory to a ZIP file
static void CompressDirectory(string sourceDirectory, string zipFilePath)
{
using (var zipOutputStream = new ZipOutputStream(File.Create(zipFilePath)))
{
zipOutputStream.SetLevel(5); // Set compression level (0-9), 5 as a mid-range
// Recursively add files in the source directory to the ZIP file
AddDirectoryFilesToZip(sourceDirectory, zipOutputStream);
zipOutputStream.Finish();
zipOutputStream.Close();
}
}
// Method to add files from a directory to a ZIP output stream
static void AddDirectoryFilesToZip(string sourceDirectory, ZipOutputStream zipOutputStream)
{
// Get list of files in the directory
string[] files = Directory.GetFiles(sourceDirectory);
foreach (string file in files)
{
var entry = new ZipEntry(Path.GetFileName(file)); // Create a new entry for each file
zipOutputStream.PutNextEntry(entry);
using (var fileStream = File.OpenRead(file))
{
// Buffer for reading files
byte[] buffer = new byte[4096];
int sourceBytes;
// Read file and write to ZIP stream
while ((sourceBytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
zipOutputStream.Write(buffer, 0, sourceBytes);
}
}
}
// Handle subdirectories recursively
string[] subdirectories = Directory.GetDirectories(sourceDirectory);
foreach (string subdirectory in subdirectories)
{
AddDirectoryFilesToZip(subdirectory, zipOutputStream);
}
}
// Method to decompress files from a ZIP file
static void Decompress(string zipFilePath, string extractPath)
{
using (var zipInputStream = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry entry;
// Read entries from the ZIP archive
while ((entry = zipInputStream.GetNextEntry()) != null)
{
string entryPath = Path.Combine(extractPath, entry.Name);
// Process files
if (entry.IsFile)
{
string directoryName = Path.GetDirectoryName(entryPath);
if (!Directory.Exists(directoryName))
Directory.CreateDirectory(directoryName);
using (var fileStream = File.Create(entryPath))
{
// Buffer for reading entries
byte[] buffer = new byte[4096];
int bytesRead;
// Read from ZIP stream and write to file
while ((bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, bytesRead);
}
}
}
else if (entry.IsDirectory) // Process directories
{
Directory.CreateDirectory(entryPath);
}
}
}
}
}
}
Imports ICSharpCode.SharpZipLib.Zip
Imports System
Imports System.IO
Namespace SharpZipLibExample
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim sourceDirectory As String = "C:\SourceDirectory" ' Source directory containing files to compress
Dim zipFilePath As String = "C:\OutputDirectory\compressed.zip" ' Output path for the compressed ZIP file
' Compress files from the source directory
CompressDirectory(sourceDirectory, zipFilePath)
Console.WriteLine("Files compressed successfully.")
Dim extractPath As String = "C:\OutputDirectory\extracted" ' Path to extract the decompressed files
' Decompress files from the ZIP archive
Decompress(zipFilePath, extractPath)
Console.WriteLine("Files decompressed successfully.")
End Sub
' Method to compress all files in a directory to a ZIP file
Private Shared Sub CompressDirectory(ByVal sourceDirectory As String, ByVal zipFilePath As String)
Using zipOutputStream As New ZipOutputStream(File.Create(zipFilePath))
zipOutputStream.SetLevel(5) ' Set compression level (0-9), 5 as a mid-range
' Recursively add files in the source directory to the ZIP file
AddDirectoryFilesToZip(sourceDirectory, zipOutputStream)
zipOutputStream.Finish()
zipOutputStream.Close()
End Using
End Sub
' Method to add files from a directory to a ZIP output stream
Private Shared Sub AddDirectoryFilesToZip(ByVal sourceDirectory As String, ByVal zipOutputStream As ZipOutputStream)
' Get list of files in the directory
Dim files() As String = Directory.GetFiles(sourceDirectory)
For Each file As String In files
Dim entry = New ZipEntry(Path.GetFileName(file)) ' Create a new entry for each file
zipOutputStream.PutNextEntry(entry)
Using fileStream = System.IO.File.OpenRead(file)
' Buffer for reading files
Dim buffer(4095) As Byte
Dim sourceBytes As Integer
' Read file and write to ZIP stream
sourceBytes = fileStream.Read(buffer, 0, buffer.Length)
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: while ((sourceBytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
Do While sourceBytes > 0
zipOutputStream.Write(buffer, 0, sourceBytes)
sourceBytes = fileStream.Read(buffer, 0, buffer.Length)
Loop
End Using
Next file
' Handle subdirectories recursively
Dim subdirectories() As String = Directory.GetDirectories(sourceDirectory)
For Each subdirectory As String In subdirectories
AddDirectoryFilesToZip(subdirectory, zipOutputStream)
Next subdirectory
End Sub
' Method to decompress files from a ZIP file
Private Shared Sub Decompress(ByVal zipFilePath As String, ByVal extractPath As String)
Using zipInputStream As New ZipInputStream(File.OpenRead(zipFilePath))
Dim entry As ZipEntry
' Read entries from the ZIP archive
entry = zipInputStream.GetNextEntry()
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: while ((entry = zipInputStream.GetNextEntry()) != null)
Do While entry IsNot Nothing
Dim entryPath As String = Path.Combine(extractPath, entry.Name)
' Process files
If entry.IsFile Then
Dim directoryName As String = Path.GetDirectoryName(entryPath)
If Not Directory.Exists(directoryName) Then
Directory.CreateDirectory(directoryName)
End If
Using fileStream = File.Create(entryPath)
' Buffer for reading entries
Dim buffer(4095) As Byte
Dim bytesRead As Integer
' Read from ZIP stream and write to file
bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: while ((bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)) > 0)
Do While bytesRead > 0
fileStream.Write(buffer, 0, bytesRead)
bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)
Loop
End Using
ElseIf entry.IsDirectory Then ' Process directories
Directory.CreateDirectory(entryPath)
End If
entry = zipInputStream.GetNextEntry()
Loop
End Using
End Sub
End Class
End Namespace
SharpZipLib 長期以來都是 .NET 語言開發社區的主要工具,提供處理 ZIP、GZip、Tar 和 BZip2 等壓縮檔案的基本功能。然而,隨著技術的演進和開發人員尋求更先進的解決方案,SharpZipLib 的某些限制變得明顯。
SharpZipLib 的限制
1.複雜性: SharpZipLib 的 API 可能很繁瑣冗長,需要開發人員編寫冗長的程式碼來執行創建或提取 ZIP 歸檔等簡單任務。 2.缺乏現代功能: SharpZipLib 缺乏對現代 .NET 功能和平台的支持,使其不太適合當代開發環境。 3.文件有限:雖然 SharpZipLib 已經存在很長時間了,但其文件通常很少且過時,這使得開發人員難以入門或解決問題。 4.性能: SharpZipLib 的性能可能並不總是能滿足開發人員的期望,尤其是在處理大型或複雜的歸檔文件時。
IronZIP:架起溝通的橋梁
IronZIP說明文件由Iron Software 總覽開發,是在 .NET 應用程式中管理 ZIP 檔案的現代化有效解決方案。 透過其直覺的 API,開發人員可以輕鬆地建立、讀取和處理 ZIP 檔案。 IronZIP 提供自訂壓縮等級和密碼保護等進階功能,確保靈活性和資料安全性。 IronZIP 與最新的 .NET 版本相容,並針對效能進行最佳化,可輕鬆、有效率地簡化歸檔管理任務。

IronZIP功能作為一個強大且現代化的解決方案出現,解決了 SharpZipLib 的缺點。 以下是 IronZIP 如何填補缺口:
1.進階 API: IronZIP 提供直覺且對開發者友善的 API,簡化歸檔管理任務。 有了 IronZIP,開發人員只需幾行程式碼就能完成複雜的操作,減少開發時間和精力。 2.完全支援 .NET: IronZIP 完全支援最新的 .NET 版本,包括 .NET Core、.NET Standard 和 .NET Framework,確保與現代開發環境和平台相容。 3.全面的文件: IronZIP 附帶全面的文件和範例,使開發人員能夠快速掌握其特性和功能。 廣泛的文件有助於簡化學習曲線,並促進專案的快速整合。 4.壓縮等級控制: IronZIP 為開發者提供了對壓縮等級的控制,讓他們可以根據自身需求調整壓縮等級。 此功能可讓開發人員在減少檔案大小與壓縮速度之間取得平衡。 5.密碼保護: IronZIP 支援對 ZIP 壓縮檔案進行密碼保護,進而增強敏感資料的安全性。 開發人員可以使用傳統、AES128 和 AES256 密碼輕鬆加密 ZIP 存檔,確保只有授權使用者才能存取存檔內容。 6.性能優化: IronZIP 針對性能進行了優化,與 SharpZipLib 相比,可提供更快的壓縮和提取速度。 此最佳化可確保開發人員能有效率地處理大量資料,而不會影響效能。
探索IronZIP文件,以獲得更多關於開始使用IronZIP的資訊。IronZIP程式碼範例可協助您輕鬆上手。
IronZIP 安裝
以下是將 XDocument 與 IronPDF 整合的步驟:
- 開啟 Visual Studio IDE 或您偏好的 IDE。
- 從"工具"功能表,導覽至 NuGet Package Manager Console。
-
執行下列指令來安裝 IronZIP 套件:
Install-Package IronPdf
- 另外,您也可以從 NuGet Package Manager for Solutions 安裝。
- 從 NuGet 瀏覽標籤選取 IronZIP,然後按一下安裝:

程式碼範例
以下原始碼顯示 IronZIP 如何有效率地 使用 IronZIP 輕鬆建立 ZIP 檔案,而且只需要幾行程式碼。 在此,您可以透過提供指定資料夾中的檔案名稱,將多個檔案新增至 密碼保護的 ZIP 存檔。 在建立 IronZipArchive 物件時,您還可以指定壓縮等級以減少輸出檔案的空間大小。
using IronZip;
using IronZip.Enum;
class Program
{
static void Main()
{
// Create an empty ZIP with the highest compression
using (var archive = new IronZipArchive(9))
{
// Password protect the ZIP (Support AES128 & AES256)
archive.SetPassword("P@ssw0rd", EncryptionMethods.Traditional);
archive.AddArchiveEntry("./assets/file1.txt");
archive.AddArchiveEntry("./assets/file2.txt");
// Export the ZIP
archive.SaveAs("output.zip");
}
}
}
using IronZip;
using IronZip.Enum;
class Program
{
static void Main()
{
// Create an empty ZIP with the highest compression
using (var archive = new IronZipArchive(9))
{
// Password protect the ZIP (Support AES128 & AES256)
archive.SetPassword("P@ssw0rd", EncryptionMethods.Traditional);
archive.AddArchiveEntry("./assets/file1.txt");
archive.AddArchiveEntry("./assets/file2.txt");
// Export the ZIP
archive.SaveAs("output.zip");
}
}
}
Imports IronZip
Imports IronZip.Enum
Friend Class Program
Shared Sub Main()
' Create an empty ZIP with the highest compression
Using archive = New IronZipArchive(9)
' Password protect the ZIP (Support AES128 & AES256)
archive.SetPassword("P@ssw0rd", EncryptionMethods.Traditional)
archive.AddArchiveEntry("./assets/file1.txt")
archive.AddArchiveEntry("./assets/file2.txt")
' Export the ZIP
archive.SaveAs("output.zip")
End Using
End Sub
End Class
輸出 Zip 檔案

結論
SharpZipLib 總覽作為 .NET 的強大壓縮函式庫出現,提供豐富的特性和功能,可有效率地處理壓縮檔案。 無論是壓縮資料儲存、檔案歸檔,或是優化網路服務的頻寬使用,SharpZipLib 都能提供必要的工具來簡化壓縮與解壓縮作業。 SharpZipLib 擁有開放原始碼的特性、跨平台相容性以及強大的功能,對於在 .NET 應用程式中尋求可靠壓縮任務解決方案的開發人員而言,SharpZipLib 仍然是首選。
雖然 SharpZipLib 一直是在 .NET 應用程式中處理壓縮檔案的可靠選擇,但在現今的開發環境中,它的限制已變得越來越明顯。 Explore IronZIP API 的介入填補了 SharpZipLib 所留下的空白,提供了一個現代化且功能豐富的替代方案,並將易用性、效能和相容性放在首位。 透過 IronZIP,開發人員可以發掘歸檔管理的新可能性,並利用先進的功能和直覺式 API 簡化開發工作流程。
IronZIP 提供免費試用授權概觀。 請從 IronZIP Downloads 下載函式庫並試用。
常見問題解答
如何在C#中使用SharpZipLib解壓ZIP檔案?
要在C#中使用SharpZipLib解壓ZIP檔案,您可以使用FastZip類,它提供了提取ZIP存檔的方法。您可以初始化FastZip的新實例,並使用ExtractZip方法,指定來源和目標路徑。
SharpZipLib for .NET的常見特性有哪些?
SharpZipLib支援多種壓縮格式,如ZIP、GZip和Tar。它允許基於流的操作、可調整的壓縮級別,並包括密碼保護以確保ZIP存檔的安全。
如何在.NET應用程式中提高壓縮性能?
IronZIP為壓縮任務提供了優化的性能。它提供直觀的API、可自定義的壓縮級別,並支援最新的.NET版本,實現高效管理ZIP檔案。
使用較舊的壓縮庫如SharpZipLib有哪些挑戰?
一些挑戰包括繁瑣的API、缺乏現代功能、有限的文檔,以及處理大型存檔時的潛在性能問題。
IronZIP如何提升.NET壓縮任務的工作效率?
IronZIP通過提供進階特性如可自定義的壓縮、密碼保護和直觀的API提升工作效率。它還提供全面的文檔,並支援最新的.NET版本以實現無縫整合。
我可以在C#中使用SharpZipLib用密碼保護ZIP檔案嗎?
可以,SharpZipLib允許您用密碼保護ZIP檔案。您可以使用ZipOutputStream並設置Password屬性為ZIP檔案指定密碼。
IronZIP作為SharpZipLib的現代替代方案有何特點?
IronZIP提供一個現代的替代方案,具有直觀的API、全面的文檔、對最新.NET版本的完整支援、密碼保護及優化的性能等特點。
如何在我的.NET專案中安裝SharpZipLib?
您可以通過Visual Studio中的NuGet包管理器安裝SharpZipLib。搜索'SharpZipLib'並安裝以整合到您的.NET專案中。
使用IronZIP比傳統庫有哪些優勢?
IronZIP提供如直觀的API、增強的性能、對現代.NET框架的支援、可自定義的壓縮級別及強大的密碼保護等優勢。
在哪裡可以找到SharpZipLib的資源和文檔?
SharpZipLib的文檔和資源可以在其官方NuGet頁面和GitHub庫找到,提供整合和使用的指南和示例。



