.NET C# 将文件夹压缩至 zip
创始人
2024-11-14 12:35:29
0

.NET C# 将文件夹压缩至 zip

文章目录

  • .NET C# 将文件夹压缩至 zip
    • 1 使用 System.IO.Compression
      • 1.1 环境
      • 1.2 压缩文件夹
        • 1.2.1 简单压缩
        • 1.2.2 复杂压缩
      • 1.3 解压缩
        • 1.3.1 简单解压缩
        • 1.3.2 复杂解压缩
    • 2 使用 SharpZipLib
      • 2.1 环境
      • 2.2 压缩文件夹
      • 2.3 解压缩
    • 3 压缩效果简单测试

1 使用 System.IO.Compression

1.1 环境

  • .NET 6

1.2 压缩文件夹

1.2.1 简单压缩
using System.IO.Compression;  string sourceDirectory = @"C:\path\to\your\folder"; // 需要压缩的文件夹路径 string destinationZipFilePath = @"C:\path\to\your\output.zip"; // 生成的zip文件路径 // 压缩文件夹 ZipFile.CreateFromDirectory(sourceDirectory, destinationZipFilePath); 

注意事项

  • 请确保路径正确,并且具有对该路径的读写权限。
  • 如果目标zip文件已存在,该方法将覆盖该文件。如果你想避免覆盖,可以在压缩前检查文件是否存在,并进行相应处理。
1.2.2 复杂压缩

如果你需要更复杂的压缩选项,比如排除某些文件或文件夹,可以使用ZipArchive类来进行更细粒度的控制。

using System.IO.Compression;  string sourceDirectory = @"C:\path\to\your\folder"; string destinationZipFilePath = @"C:\path\to\your\output.zip";  using (FileStream zipToOpen = new FileStream(destinationZipFilePath, FileMode.Create)) {     using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))     {         DirectoryInfo directorySelected = new DirectoryInfo(sourceDirectory);          foreach (FileInfo fileToCompress in directorySelected.GetFiles())         {             // 过滤特定文件(例如,排除所有.txt文件)             if (fileToCompress.Extension == ".txt")                 continue;              archive.CreateEntryFromFile(fileToCompress.FullName, fileToCompress.Name);         }     } } 

1.3 解压缩

1.3.1 简单解压缩
using System.IO.Compression;  string sourceZipFilePath = @"C:\path\to\your\archive.zip"; // 需要解压缩的zip文件路径 string destinationDirectory = @"C:\path\to\your\output\folder"; // 解压缩到的目标文件夹路径 // 解压缩zip文件 ZipFile.ExtractToDirectory(sourceZipFilePath, destinationDirectory); 

注意事项

  • 请确保路径正确,并且具有对该路径的读写权限。
  • 如果目标文件夹已存在且包含与zip文件中相同名称的文件,该方法将抛出异常。如果你想避免此问题,可以在解压缩前检查文件夹是否存在,并进行相应处理。
1.3.2 复杂解压缩
using System.IO.Compression;  string sourceZipFilePath = @"C:\path\to\your\archive.zip"; string destinationDirectory = @"C:\path\to\your\output\folder";  using (ZipArchive archive = ZipFile.OpenRead(sourceZipFilePath)) {     foreach (ZipArchiveEntry entry in archive.Entries)     {         // 解压缩所有文件到目标文件夹         string destinationPath = Path.Combine(destinationDirectory, entry.FullName);          // 如果条目是目录,则创建目录         if (entry.Name == "")         {             Directory.CreateDirectory(destinationPath);         }         else         {             // 创建包含该条目的目录             Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));              // 解压缩文件             entry.ExtractToFile(destinationPath, overwrite: true);         }     } } 

2 使用 SharpZipLib

2.1 环境

  • .NET 6
  • SharpZipLib 1.4.2

2.2 压缩文件夹

using System; using System.IO; using ICSharpCode.SharpZipLib.Zip;  class Program {     static void Main()     {         string sourceDirectory = @"C:\path\to\your\folder"; // 需要压缩的文件夹路径         string destinationZipFilePath = @"C:\path\to\your\output.zip"; // 生成的zip文件路径          // 压缩文件夹         CompressFolder(sourceDirectory, destinationZipFilePath);          Console.WriteLine("文件夹已成功压缩到 " + destinationZipFilePath);     }      static void CompressFolder(string sourceDir, string zipFilePath)     {         // 创建目标zip文件         using (FileStream fsOut = File.Create(zipFilePath))         using (ZipOutputStream zipStream = new ZipOutputStream(fsOut))         {             zipStream.SetLevel(3); // 设置压缩级别(0-9)              // 遍历源文件夹中的所有文件和目录             int folderOffset = sourceDir.Length + (sourceDir.EndsWith("\\") ? 0 : 1);              CompressDirectory(sourceDir, zipStream, folderOffset);         }     }      static void CompressDirectory(string path, ZipOutputStream zipStream, int folderOffset)     {         string[] files = Directory.GetFiles(path);          foreach (string filename in files)         {             FileInfo fi = new FileInfo(filename);              string entryName = filename.Substring(folderOffset); // 创建条目名             entryName = ZipEntry.CleanName(entryName); // 清理名称              ZipEntry newEntry = new ZipEntry(entryName);             newEntry.DateTime = fi.LastWriteTime; // 设置条目的日期时间             newEntry.Size = fi.Length; // 设置条目的大小              zipStream.PutNextEntry(newEntry);              // 写入文件内容             byte[] buffer = new byte[4096];             using (FileStream streamReader = File.OpenRead(filename))             {                 StreamUtils.Copy(streamReader, zipStream, buffer);             }             zipStream.CloseEntry();         }          // 递归处理目录         string[] folders = Directory.GetDirectories(path);         foreach (string folder in folders)         {             CompressDirectory(folder, zipStream, folderOffset);         }     } } 

2.3 解压缩

using System; using System.IO; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip;  class Program {     static void Main()     {         string sourceZipFilePath = @"C:\path\to\your\archive.zip"; // 需要解压缩的zip文件路径         string destinationDirectory = @"C:\path\to\your\output\folder"; // 解压缩到的目标文件夹路径          // 解压缩zip文件         ExtractZipFile(sourceZipFilePath, destinationDirectory);          Console.WriteLine("文件已成功解压缩到 " + destinationDirectory);     }      static void ExtractZipFile(string archiveFilenameIn, string outFolder)     {         ZipFile zf = null;         try         {             FileStream fs = File.OpenRead(archiveFilenameIn);             zf = new ZipFile(fs);              foreach (ZipEntry zipEntry in zf)             {                 if (!zipEntry.IsFile)                 {                     continue; // 忽略目录条目                 }                  string entryFileName = zipEntry.Name;                 string fullZipToPath = Path.Combine(outFolder, entryFileName);                 string directoryName = Path.GetDirectoryName(fullZipToPath);                  // 创建目录                 if (directoryName.Length > 0)                 {                     Directory.CreateDirectory(directoryName);                 }                  byte[] buffer = new byte[4096]; // 4K是推荐的缓冲区大小                  // 解压缩文件                 using (Stream zipStream = zf.GetInputStream(zipEntry))                 using (FileStream streamWriter = File.Create(fullZipToPath))                 {                     StreamUtils.Copy(zipStream, streamWriter, buffer);                 }             }         }         finally         {             if (zf != null)             {                 zf.IsStreamOwner = true; // 使ZipFile也关闭文件流                 zf.Close();             }         }     } } 

3 压缩效果简单测试

组件压缩等级耗时(ms)结果数据大小(KB)
System.IO.Compression124233360197
535895354376
9137136351221
SharpZipLibNoCompression8561046400
Fastest11571373848
Optimal18642353490
SmallestSize85536351208

相关内容

热门资讯

第五分钟了解!新青鸟必胜(辅助... 第五分钟了解!新青鸟必胜(辅助)决胜山西麻将开挂辅助工具-总是存在有修改器1、超多福利:超高返利,海...
第十分钟了解!朱雀开心罗松开挂... 第十分钟了解!朱雀开心罗松开挂(辅助)大神棋牌开挂辅助软件-总是是有修改器1、每一步都需要思考,不同...
第一分钟了解!天天微友开控制多... 第一分钟了解!天天微友开控制多少钱(辅助)米乐开挂辅助安装-都是是真的工具1、进入游戏-大厅左侧-新...
3分钟了解!天天卡五星辅助(辅... 3分钟了解!天天卡五星辅助(辅助)掌中乐开挂辅助软件-都是是真的软件1、全新机制【天天卡五星辅助ai...
第7分钟了解!宝宝临海辅助器(... 第7分钟了解!宝宝临海辅助器(辅助)爱玩联盟开挂辅助平台-果然真的是有辅助宝宝临海辅助器辅助器是一种...
8分钟了解!陕麻圈透视科技工具... 8分钟了解!陕麻圈透视科技工具(辅助)新青鸟开挂辅助辅助器-其实有挂工具1、完成陕麻圈透视科技工具有...
第一分钟了解!闲来贵州黑科技辅... 第一分钟了解!闲来贵州黑科技辅助软件(辅助)中至景德镇麻将开挂辅助平台-其实是真的脚本1、金币登录送...
第七分钟了解!贪吃蛇辅助器20... 第七分钟了解!贪吃蛇辅助器2022(辅助)温州茶苑开挂辅助下载-果然真的是有下载1、用户打开应用后不...
一分钟了解!广西八一字牌辅助(... 一分钟了解!广西八一字牌辅助(辅助)叮叮娱乐开挂辅助工具-总是真的有app1、让任何用户在无需广西八...
第十分钟了解!福建13水源码(... 第十分钟了解!福建13水源码(辅助)么么棋牌开挂辅助安装-一直真的是有软件1、金币登录送、破产送、升...