.NET 幫助

Sharpziplib 擷取 ZIP C#(開發者操作方式)

發佈 2024年6月6日
分享:

在當今數位環境中,數據管理至關重要,擁有高效的壓縮和解壓縮工具是至關重要的。在 .NET 生態系統中,一個突出的工具是 SharpZipLib. 在本文中,我們將深入探討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 框架,與多個平台相容,包括 Windows、Linux 和 macOS,提高了其多樣性。

  3. 輕量且高效: SharpZipLib 設計輕量且高效,最大程度地減少資源消耗,同時提供高性能的壓縮和解壓縮能力。

  4. 豐富的文件和支援: 全面的文件和社群支援使開發人員更容易在使用 SharpZipLib 時進行整合和除錯。

創建 C# Visual Studio 專案

  1. 打開 Visual Studio 並點擊「建立新專案」選項。

  2. 根據需求選擇適當的專案範本。 (例如,控制台應用程式,Windows Forms 應用程式).

    Sharpziplib 提取 ZIP C#(開發者如何使用):圖 1 - 對於新專案,選擇 C# 的 "主控台應用程式"。

  3. 指定專案名稱和位置,然後點擊“下一步”。

    Sharpziplib 提取 ZIP C# (開發者如何使用):圖 2 - 通過指定項目名稱、位置和解決方案名稱來配置您的項目。接下來,選擇 .NET Framework 並點擊創建。

  4. 在附加信息中,選擇最新的 .NET 框架。點擊“創建”來創建專案。

安裝過程

要將SharpZipLib整合到您的 .NET 項目中:

  1. 在您的 Visual Studio C# 主控台應用程式中,在 Solution Explorer 中右鍵點擊你的專案並選擇 "管理 NuGet 套件..."

  2. 在 NuGet 套件管理器窗口中,搜索 "SharpZipLib"。

    Sharpziplib 解壓縮 ZIP C#(如何為開發人員提供操作說明):圖 3 - 使用 NuGet 套件管理器中的「管理 NuGet 套件」來安裝 SharpZipLib,通過在 NuGet 套件管理器的搜索欄中搜索「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";
            string zipFilePath = @"C:\OutputDirectory\compressed.zip";
            // Compress files
            CompressDirectory(sourceDirectory, zipFilePath);
            Console.WriteLine("Files compressed successfully.");
            string extractPath = @"C:\OutputDirectory\extracted";
            // Decompress files
            Decompress(zipFilePath, extractPath);
            Console.WriteLine("Files decompressed successfully.");
        }
        static void CompressDirectory(string sourceDirectory, string zipFilePath)
        {
            using (var zipOutputStream = new ZipOutputStream(File.Create(zipFilePath)))
            {
                zipOutputStream.SetLevel(5); // Compression level (0-9)
                // Recursively add files in the source directory to the ZIP file
                AddDirectoryFilesToZip(sourceDirectory, zipOutputStream);
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }
        }
        static void AddDirectoryFilesToZip(string sourceDirectory, ZipOutputStream zipOutputStream)
        {
            string[] files = Directory.GetFiles(sourceDirectory);
            foreach (string file in files)
            {
                var entry = new ZipEntry(Path.GetFileName(file));
                zipOutputStream.PutNextEntry(entry);
                using (var fileStream = File.OpenRead(file))
                {
                    byte[] buffer = new byte[4096];
                    int sourceBytes;
                    while ((sourceBytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        zipOutputStream.Write(buffer, 0, sourceBytes);
                    }
                }
            }
            string[] subdirectories = Directory.GetDirectories(sourceDirectory);
            foreach (string subdirectory in subdirectories)
            {
                AddDirectoryFilesToZip(subdirectory, zipOutputStream);
            }
        }
        static void Decompress(string zipFilePath, string extractPath)
        {
            using (var zipInputStream = new ZipInputStream(File.OpenRead(zipFilePath)))
            {
                ZipEntry entry;
                while ((entry = zipInputStream.GetNextEntry()) != null)
                {
                    string entryPath = Path.Combine(extractPath, entry.Name);
                    if (entry.IsFile)
                    {
                        string directoryName = Path.GetDirectoryName(entryPath);
                        if (!Directory.Exists(directoryName))
                            Directory.CreateDirectory(directoryName);
                        using (var fileStream = File.Create(entryPath))
                        {
                            byte[] buffer = new byte[4096];
                            int bytesRead;
                            while ((bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                fileStream.Write(buffer, 0, bytesRead);
                            }
                        }
                    }
                    else if (entry.IsDirectory)
                    {
                        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";
            string zipFilePath = @"C:\OutputDirectory\compressed.zip";
            // Compress files
            CompressDirectory(sourceDirectory, zipFilePath);
            Console.WriteLine("Files compressed successfully.");
            string extractPath = @"C:\OutputDirectory\extracted";
            // Decompress files
            Decompress(zipFilePath, extractPath);
            Console.WriteLine("Files decompressed successfully.");
        }
        static void CompressDirectory(string sourceDirectory, string zipFilePath)
        {
            using (var zipOutputStream = new ZipOutputStream(File.Create(zipFilePath)))
            {
                zipOutputStream.SetLevel(5); // Compression level (0-9)
                // Recursively add files in the source directory to the ZIP file
                AddDirectoryFilesToZip(sourceDirectory, zipOutputStream);
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }
        }
        static void AddDirectoryFilesToZip(string sourceDirectory, ZipOutputStream zipOutputStream)
        {
            string[] files = Directory.GetFiles(sourceDirectory);
            foreach (string file in files)
            {
                var entry = new ZipEntry(Path.GetFileName(file));
                zipOutputStream.PutNextEntry(entry);
                using (var fileStream = File.OpenRead(file))
                {
                    byte[] buffer = new byte[4096];
                    int sourceBytes;
                    while ((sourceBytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        zipOutputStream.Write(buffer, 0, sourceBytes);
                    }
                }
            }
            string[] subdirectories = Directory.GetDirectories(sourceDirectory);
            foreach (string subdirectory in subdirectories)
            {
                AddDirectoryFilesToZip(subdirectory, zipOutputStream);
            }
        }
        static void Decompress(string zipFilePath, string extractPath)
        {
            using (var zipInputStream = new ZipInputStream(File.OpenRead(zipFilePath)))
            {
                ZipEntry entry;
                while ((entry = zipInputStream.GetNextEntry()) != null)
                {
                    string entryPath = Path.Combine(extractPath, entry.Name);
                    if (entry.IsFile)
                    {
                        string directoryName = Path.GetDirectoryName(entryPath);
                        if (!Directory.Exists(directoryName))
                            Directory.CreateDirectory(directoryName);
                        using (var fileStream = File.Create(entryPath))
                        {
                            byte[] buffer = new byte[4096];
                            int bytesRead;
                            while ((bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                fileStream.Write(buffer, 0, bytesRead);
                            }
                        }
                    }
                    else if (entry.IsDirectory)
                    {
                        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"
			Dim zipFilePath As String = "C:\OutputDirectory\compressed.zip"
			' Compress files
			CompressDirectory(sourceDirectory, zipFilePath)
			Console.WriteLine("Files compressed successfully.")
			Dim extractPath As String = "C:\OutputDirectory\extracted"
			' Decompress files
			Decompress(zipFilePath, extractPath)
			Console.WriteLine("Files decompressed successfully.")
		End Sub
		Private Shared Sub CompressDirectory(ByVal sourceDirectory As String, ByVal zipFilePath As String)
			Using zipOutputStream As New ZipOutputStream(File.Create(zipFilePath))
				zipOutputStream.SetLevel(5) ' Compression level (0-9)
				' Recursively add files in the source directory to the ZIP file
				AddDirectoryFilesToZip(sourceDirectory, zipOutputStream)
				zipOutputStream.Finish()
				zipOutputStream.Close()
			End Using
		End Sub
		Private Shared Sub AddDirectoryFilesToZip(ByVal sourceDirectory As String, ByVal zipOutputStream As ZipOutputStream)
			Dim files() As String = Directory.GetFiles(sourceDirectory)
			For Each file As String In files
				Dim entry = New ZipEntry(Path.GetFileName(file))
				zipOutputStream.PutNextEntry(entry)
				Using fileStream = System.IO.File.OpenRead(file)
					Dim buffer(4095) As Byte
					Dim sourceBytes As Integer
					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
			Dim subdirectories() As String = Directory.GetDirectories(sourceDirectory)
			For Each subdirectory As String In subdirectories
				AddDirectoryFilesToZip(subdirectory, zipOutputStream)
			Next subdirectory
		End Sub
		Private Shared Sub Decompress(ByVal zipFilePath As String, ByVal extractPath As String)
			Using zipInputStream As New ZipInputStream(File.OpenRead(zipFilePath))
				Dim entry As ZipEntry
				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)
					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)
							Dim buffer(4095) As Byte
							Dim bytesRead As Integer
							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
						Directory.CreateDirectory(entryPath)
					End If
					entry = zipInputStream.GetNextEntry()
				Loop
			End Using
		End Sub
	End Class
End Namespace
VB   C#

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 提供進階功能,例如可自定義的壓縮等級和密碼保護,確保了靈活性和資料安全性。兼容最新的 .NET 版本並針對性能進行了優化,IronZIP 以輕鬆且高效的方式簡化了檔案管理任務。

Sharpziplib 解壓 ZIP C#(開發人員如何操作):圖 4 - IronZIP for .NET:C# ZIP 檔案庫

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 安裝

以下是將 XDocument 與 IronPDF 整合的步驟:

  • 開啟 Visual Studio 或您偏好的IDE。
  • 從工具選單,導航到NuGet套件管理器主控台。
  • 執行以下命令來安裝IronZIP套件:
  :ProductInstall
  • 或者,您可以從 NuGet 套件管理器為解決方案安裝它。
  • 從 NuGet 瀏覽選項卡中選擇 IronZIP 並點擊安裝:

Sharpziplib 提取 ZIP C#(開發人員使用說明):圖 5 - 使用 NuGet 套件管理器為方案管理 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
VB   C#

輸出壓縮檔

Sharpziplib 提取 ZIP C#(它是如何為開發人員工作的):圖6 - 輸出:使用 IronZIP 創建的設有密碼保護的 Zip 壓縮檔。

結論

SharpZipLib 成為 .NET 的強大壓縮庫,提供一套豐富的功能和能力來高效處理壓縮文件。無論是為存儲而壓縮數據、歸檔文件,還是優化網絡服務中的帶寬使用,SharpZipLib 都提供了必要的工具來簡化壓縮和解壓操作。憑藉其開源特性、跨平台兼容性和強大的功能性,SharpZipLib 一直是尋求可靠壓縮解決方案的開發人員的首選。

雖然 SharpZipLib 一直是 .NET 應用程序中處理壓縮檔案的可靠選擇,但在當今的開發環境中,其局限性越來越明顯。 IronZIP 填補SharpZipLib留下的缺口,提供一個現代且功能豐富的替代方案,優先考慮易用性、性能和兼容性。使用IronZIP,開發者可以在檔案管理方面開啟新的可能性,並通過先進的功能和直觀的操作簡化他們的開發流程。 API鉄ZIP 提供一个 免費試用 頁面。從 連結並試試看。

< 上一頁
Xceed.Document .NET(開發人員如何使用)
下一個 >
Xdocument C#(其運作方式對於開發者)

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >