当前位置: 首页 > news >正文

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

.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

相关文章:

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

.NET C# 将文件夹压缩至 zip 文章目录 .NET C# 将文件夹压缩至 zip1 使用 System.IO.Compression1.1 环境1.2 压缩文件夹1.2.1 简单压缩1.2.2 复杂压缩 1.3 解压缩1.3.1 简单解压缩1.3.2 复杂解压缩 2 使用 SharpZipLib2.1 环境2.2 压缩文件夹2.3 解压缩 3 压缩效果简单测试 1 …...

软考基本介绍

一,基本了解 计算机技术与软件专业技术资格(水平)考试(简称软件考试)为国家级考试。 考试设置了27个专业资格,涵盖5个专业领域, 3个级别层次(初级、中级、高级)。 中国计算机技术职业…...

【Vue】vue3 中使用 ResizeObserver 监听元素的尺寸宽度变化

要监听 div 宽度的变化,可以使用 ResizeObserver 接口。ResizeObserver 允许你观察一个或多个元素的尺寸变化,并在发生变化时执行回调函数。这种方法比使用 MutationObserver 更专注于尺寸变化,且不受元素属性变化的影响。 使用 ResizeObserv…...

信息安全专业好吗?

22 届的 211 信安毕业生,目前在读研(虽然已经和安全没关系),整体来看大部分高校的信安都是作为计算机的附属专业存在的,除了极具特色的几个高校,例如山大的密码学,广州大学某院士加持的网络安全…...

梧桐数据库(WuTongDB):数据库中元数据表的常见信息

元数据表是数据库系统中用于存储和管理元数据的表。这些表提供关于数据库对象(如表、列、索引、视图、存储过程等)的详细信息。以下是元数据表的一些常见类型及其详细解释: 常见元数据表类型 表信息表 表名:TABLES描述&#xff1…...

在 Linux 9 上安装 Oracle 19c:克服兼容性问题 (INS-08101)

Oracle 数据库 19c 的基础版本 (19.3) 发布的时候还没有 Linux 9 ,因此在Linux 9上面安装Oracle 19c会遇到很多兼容性问题。本文将探讨如何解决这些问题。 安装步骤 设置环境变量以绕过操作系统检查: Oracle 19.3 安装程序无法识别 Linux 9。 [WARNIN…...

【踩坑】pytorch中的索引与copy_结合不会复制数据及其解决方案

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景知识 实验验证 结论分析 错误案例 处理方法 注意事项 附加说明 基本索引返回视图 高级索引返回副本 赋值操作都是原地操作 以下内容…...

十六、【Python】基础教程 - 【Flask】网络编程开发

目录 前言 Flask 基础概念 安装 Flask 示例:创建一个 Flask Web 应用 运行 Flask 应用 更复杂的例子 测试新功能 前言 Flask 是一个用 Python 编写的微型 Web 框架,它以简单性和灵活性著称,非常适合快速开发小型到中型的 Web 应用。F…...

C#初级——List 容器

容器 在C#中&#xff0c;容器通常指的是用于存储和组织数据的集合类。 本文介绍的容器是动态数组&#xff1a;List<T> 内部使用数组来存储元素&#xff0c;当添加元素超出当前数组容量时&#xff0c;会自动调整大小&#xff08;扩容&#xff09;。 list容器 List<&g…...

serial靶机教程

靶机下载地址 https://download.vulnhub.com/serial/serial.zip 主机发现 arp-scan -l 端口扫描 nmap 192.168.229.131 -A 根据对⽐可知serial的⼀个ip地址为192.168.47.143 该靶机开启了22端⼝和80端⼝ 对⽹站进⾏⼀个访问&#xff0c;⼤概意思为这是对新的cookie处理程序…...

【Linux-MISC设备】

目录 1. MISC设备2. MISC蜂鸣器实验 1. MISC设备 MISC设备的主设备号为10.MISC设备会自动创建cdev&#xff0c;不需要再手动创建。MISC设备是基于platform的. MISC驱动的编写的核心就是初始化miscdevice结构体变量&#xff0c;然后用misc_register函数向内核注册&#xff0c;…...

【随笔】VRRP+MSTP

虚拟路由冗余协议&#xff08;Virtual Router Redundancy Protocol&#xff0c;VRRP&#xff09; 设计采用主备模式&#xff0c;将VRRP组内多个路由设备都映射为一个虚拟路由设备。 一个VRRP组中只能由一台处于主控角色的路由器&#xff0c;可以有一个或多个备份角色的路由器。…...

vue 动态增删行,并form表单校验(附v2\v3)

Vue3 组件用的 ant 可以换成你们用&#xff0c;主要是form校验 前端代码 <a-formref"formRef":model"formData":label-col-props"{ span: 5 }":wrapper-col-props"{ span: 17 }"><a-row><a-form-itemlabel"角色…...

计算机网络的基本概念

IP地址&#xff08;Internet Protocol Address&#xff09;是指在计算机网络中每个设备的唯一标识符。它用于区分不同设备并在网络中进行数据包的路由。我们平常所使用的IP地址主要版本&#xff1a; IPv4 格式: 由四个整数&#xff08;0到255&#xff09;组成&#xff0c;以点…...

Python 爬虫项目实战三:GitHub 用户信息抓取与分析

一、项目背景 爬虫技术不仅限于获取网页内容&#xff0c;还可以用于获取和分析特定网站的用户信息。本文将演示如何使用Python编写爬虫程序&#xff0c;从GitHub网站抓取用户信息&#xff0c;并进行简单的数据分析。 二、环境准备 在开始之前&#xff0c;请确保你已经安装了…...

xtrabackup搭建MySQL 8.0 主从复制

xtrabackup搭建MySQL 8.0 主从复制 安装MySQL 8.0.37安装xtrabackupGTIDs初始化从库参考&#xff1a;GTID概述GTID相较与传统复制的优势GTID自身存在哪些限制GTID工作原理简单介绍如何开启GTID复制GTID与传统模式建立复制时候语句的不同点传统复制GTID复制 GTID同步状态简单解析…...

Java程序员接单分享

作为一名Java程序员&#xff0c;这阵子通过承接些小型项目&#xff0c;我顺利跨过了月薪破万的门槛。这些项目虽小&#xff0c;却如同磨刀石般&#xff0c;让我在实战中发现了自身技术栈的棱角与不足&#xff0c;尤其是意识到了在Java这一浩瀚技术海洋中的诸多未知领域。我深知…...

【HarmonyOS NEXT星河版开发学习】小型测试案例01-今日头条置顶练习

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面 ​ 前言 本系列可能是博客首发&#xff0c;鸿蒙开发星河版是一个全新的版本&#xff0c;由于参考视频较少鸿蒙开发不被重视导致csdn上面并没有全套的学习路线&#xff0c;…...

C语言----计算开机时间

计算开机时间 实例说明 编程实现计算开机时间&#xff0c;要求在每次开始计算开机时间时都能接着上次记录的结果向下记录。 实现过程&#xff1a; 1. 在TC中创建一个C文件。 2. 引用头文件&#xff0c;代码如下: #include <stdio.h> 3. 定义结构体time&#xff0c;用来…...

批发行业进销存-登录适配 android 横竖屏幕 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、横竖屏切换的意义 以下是移动端横屏竖屏可切换在进销存中的一些重要应用&#xff1a; a、数据录入与查看 在录入商品信息、库存数量等大量数据时&#xff0c;横屏模式可以提供更宽阔的输入区域&#xff0c;减少输入错误。例如&#xff0c;在输入长串的商品编码或详细的商…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

【java面试】微服务篇

【java面试】微服务篇 一、总体框架二、Springcloud&#xff08;一&#xff09;Springcloud五大组件&#xff08;二&#xff09;服务注册和发现1、Eureka2、Nacos &#xff08;三&#xff09;负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...

React与原生事件:核心差异与性能对比解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

Kaggle-Predicting Optimal Fertilizers-(多分类+xgboost+同一特征值多样性)

Predicting Optimal Fertilizers 题意&#xff1a; 给出土壤的特性&#xff0c;预测出3种最佳的肥料 数据处理&#xff1a; 1.有数字型和类别型&#xff0c;类别不能随意换成数字&#xff0c;独热编码。cat可以直接处理category类型。 2.构造一些相关土壤特性特征 3.由于la…...