Sharpziplib 提取 ZIP C#(开发人员如何使用)
在当今数字化环境中,数据管理至关重要,因此拥有高效的压缩和解压缩工具至关重要。 在.NET生态系统中,有一个脱颖而出的工具是SharpZipLib。 在本文中,我们将深入探讨SharpZipLib,探索它的功能、应用及如何将其集成到你的.NET项目中。
什么是 SharpZipLib?
SharpZipLib是一个功能丰富的开源压缩库,专为.NET编写,完全使用C#编写。 它提供对多种压缩格式的全面支持,包括ZIP、GZip和Tar。 由一个专注的社区开发,SharpZipLib提供了广泛的功能,以高效地压缩和解压缩文件。
功能和能力
- 支持多种压缩格式:SharpZipLib支持流行的压缩格式,如ZIP、GZip和Tar,以满足多样化的用例和需求。
- 基于流的操作:该库在流上操作,使开发人员能够处理来自各种来源的数据,包括文件、内存流或网络流。 这种灵活性促进了在应用程序不同部分中的无缝集成。
- 压缩等级:开发人员可以根据具体需要微调压缩等级,以在压缩比和处理速度之间取得平衡。
- 密码保护:SharpZipLib允许创建受密码保护的ZIP档案,通过用指定的密码加密内容来确保数据安全。
- 错误处理和恢复:强大的错误处理机制使开发人员能够在压缩和解压缩操作期间优雅地处理异常。 此外,SharpZipLib支持从损坏的档案中恢复,提高了可靠性。
用例
- 文件压缩和归档:SharpZipLib非常适合需要压缩和归档文件的应用程序,例如备份工具、文件管理工具或数据导出功能。
- Web服务和API:处理文件传输或数据交换的Web服务通常受益于压缩以减少带宽使用。 SharpZipLib可以无缝集成到此类服务中,以高效压缩传出数据或解压入站负载。
- 桌面应用程序:处理大数据集或资源文件的桌面应用程序可以利用SharpZipLib来压缩文件以进行存储或分发。 这对于软件安装程序或数据同步工具尤为有用。
- 数据备份和存储:需要周期性备份或以压缩格式存储数据的应用程序可以使用SharpZipLib自动执行备份过程,并有效地保存存储空间。
SharpZipLib的优点
- 开源:作为一个开源库,SharpZipLib鼓励合作和社区贡献,确保了持续的改进和适应不断变化的需求。
- 跨平台兼容性:SharpZipLib是用C#编写的,并以.NET框架为目标,支持与Windows、Linux和macOS等多种平台的兼容,增强了其多功能性。
- 轻量和高效:SharpZipLib旨在轻量和高效,最大限度地减少资源消耗,同时提供高性能的压缩和解压缩能力。
- 广泛的文档和支持:全面的文档和社区支持使开发人员更容易在使用SharpZipLib时集成和排查问题。
创建C# Visual Studio项目
- 打开Visual Studio并点击"创建一个新的项目"选项。 2.根据您的要求选择合适的项目模板(例如,控制台应用程序、Windows 窗体应用程序)。

3.指定项目名称和位置,然后单击 "下一步"。
点击"创建"以创建项目。
4.从 "附加信息 "中选择最新的 .NET Framework。 点击"创建"以创建项目。
要将SharpZipLib集成到你的.NET项目中:
-
在你的Visual Studio IDE C# ConsoleApp中,右键点击Solution Explorer中的项目并选择"管理NuGet包..."
- 在你的 Visual Studio IDE C# ConsoleApp中,在解决方案资源管理器中右键点击你的项目并选择"管理NuGet包..."


- NuGet将自动下载并将必要的依赖项添加到你的项目中。 以下是演示如何使用SharpZipLib高效压缩和解压缩文件的简化示例:
代码示例
SharpZipLib长期以来一直是.NET语言开发社区的主力,为处理如ZIP、GZip、Tar和BZip2等压缩档案提供了基本功能。然而,随着技术的发展和开发者寻求更高级的解决方案,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的限制
1.复杂性: SharpZipLib 的 API 可能很繁琐冗长,需要开发人员编写冗长的代码来执行创建或提取 ZIP 归档等简单任务。 2.缺乏现代功能: SharpZipLib 缺乏对现代 .NET 功能和平台的支持,使其不太适合现代开发环境。 3.文档有限:虽然 SharpZipLib 已经存在很长时间了,但其文档通常很少且过时,这使得开发人员难以入门或解决问题。 4.性能: SharpZipLib 的性能可能并不总是能满足开发人员的期望,尤其是在处理大型或复杂的归档文件时。
IronZIP:弥补差距
IronZIP 是一个现代且高效的解决方案,用于在 .NET 应用程序中管理 ZIP 档案。 IronZIP 提供了可定制的压缩级别和密码保护等高级功能,确保灵活性和数据安全。 与最新的 .NET 版本兼容并经过性能优化,IronZIP 简化了归档管理任务,使其轻松高效。
1.高级 API: IronZIP 提供直观且对开发者友好的 API,简化归档管理任务。 2.完全支持 .NET: IronZIP 完全支持最新的 .NET 版本,包括 .NET Core、.NET Standard 和 .NET Framework,确保与现代开发环境和平台兼容。 3.全面的文档: IronZIP 附带全面的文档和示例,使开发人员能够快速掌握其特性和功能。 4.压缩级别控制: IronZIP 为开发者提供了对压缩级别的控制,允许他们根据自身需求调整压缩级别。 此功能使开发人员能够在文件大小减少和压缩速度之间取得平衡。 5.密码保护: IronZIP 支持对 ZIP 压缩文件进行密码保护,从而增强敏感数据的安全性。 6.性能优化: IronZIP 针对性能进行了优化,与 SharpZipLib 相比,可提供更快的压缩和提取速度。
查看 IronZIP 文档 以获取有关如何开始使用 IronZIP 的更多信息。IronZIP 代码示例 帮助您轻松开始。
以下是将 IronZIP 集成到项目中的步骤:
- 打开 Visual Studio IDE 或您偏好的 IDE。
- 运行以下命令以安装 IronZIP 包:
-
或者,您可以从解决方案的 NuGet 包管理器中安装它。
Install-Package IronPdf
- 从NuGet浏览选项卡中选择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压缩库,提供了丰富的功能和能力,以高效处理压缩文件。 无论是用于存储的数据压缩、文件归档,还是优化Web服务中的带宽使用,SharpZipLib都提供了必要的工具,以简化压缩和解压缩操作。 虽然SharpZipLib一直是.NET应用中处理压缩档案的可靠选择,但在当今开发环境中,其局限性越来越明显。
IronZIP 填补了 SharpZipLib 留下的空白,提供了一个现代化且功能丰富的替代方案,优先考虑易用性、性能和兼容性。 IronZIP 提供免费试用。
从 IronZIP 下载页面 下载该库并试用。
常见问题解答
如何在 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。在 NuGet 包管理器中搜索 'SharpZipLib' 并安装它,以将其集成到您的 .NET 项目中。
使用 IronZIP 比传统库有哪些优势?
IronZIP 提供的优势包括直观的 API、增强的性能、对现代 .NET 框架的支持、可定制的压缩级别以及对 ZIP 文件的强大密码保护。
在哪里可以找到 SharpZipLib 的资源和文档?
SharpZipLib 的文档和资源可以在其官方 NuGet 页面和 GitHub 仓库中找到,提供集成和使用的指南和示例。




