C#压缩和解压文件

这里用两种方法实现C#压缩和解压文件

1、使用System.IO.Compression名称空间下的相关类(需引用 System.IO.Compression.FileSystem和System.IO.Compression程序集)

 创建zip压缩文件

使用ZipFile类CreateFromDirectory()方法来创建zip压缩文件。它有3种重载形式,这里说一下常用的两个

 public static void CreateFromDirectory(string sourceDirectoryName,string destinationArchiveFileName)public static void CreateFromDirectory(string sourceDirectoryName,//sourceDirectoryName 要压缩的文件夹string destinationArchiveFileName, //destinationArchiveFileName 压缩后的文件名CompressionLevel compressionLevel,//compressionLevel 压缩级别  Fastest-最快 NoCompression-不压缩 Optimal-最好bool includeBaseDirectory //includeBaseDirectory 是否包含当前目录)

测试代码如下:

1 static void Main(string[] args)
2         {
3             ZipFile.CreateFromDirectory("D:\\test", "D:\\a.zip");
4         }

在D盘创建一个test目录,里面放一张图片,

运行

结果如下:

1   static void Main(string[] args)
2         {           
3             ZipFile.CreateFromDirectory("D:\\test", "D:\\b.zip",CompressionLevel.Optimal,true);
4         }

运行结果如下

解压zip压缩文件

使用 ZipFile类的ExtractToDirectory()方法

1 public static void ExtractToDirectory(
2     string sourceArchiveFileName,  //压缩文件完整路径
3     string destinationDirectoryName //指定解压文件夹
4 )
1  static void Main(string[] args)
2         {          
3             ZipFile.ExtractToDirectory("D:\\a.zip", "D:\\");
4         }

运行结果如下

这里需要注意的是,如果文件已存在,会引发一个IOException

添加文件到现有zip压缩文件

1 using (FileStream fs = new FileStream("D:\\a.zip", FileMode.Open))
2             {
3                 using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
4                 {
5                     archive.CreateEntryFromFile("C:\\Users\\ZhaoJia\\Pictures\\1.jpg","1.jpg");                                      
6                 }
7             }

运行结果如下

创建gz压缩文件

使用GZipStream类来创建gz压缩文件

 1  static void Main(string[] args)2         {3             string filePath = "D:\\test";    //要添加到压缩文件的目录4             string targetPath = "D:\\";      //压缩文件存放的目录         5 6             DirectoryInfo dirInfo = new DirectoryInfo(filePath);7 8             foreach (FileInfo fileInfo in dirInfo.GetFiles())9             {
10                 using (FileStream fsorg = fileInfo.OpenRead())
11                 {
12                     using (FileStream fs = File.Create(targetPath + fileInfo.Name + ".gz"))
13                     {
14                         using (GZipStream compressionStream = new GZipStream(fs,
15                             CompressionMode.Compress))
16                         {
17                             fsorg.CopyTo(compressionStream);
18                         }
19                     }
20                 }
21             }
22         }

使用这个类来创建gz文件有几个缺陷

1、压缩文件里只能有一个文件

2、压缩后的文件名要带上压缩文件里文件的后缀名。如有一个图像文件为a.jpg,生成的gz压缩文件名为  a.jpg.gz

解压gz压缩文件

 1   string compressFilePath = "D:\\4172212144245982608.jpg.gz";//压缩文件名2 3             FileInfo fileInfo = new FileInfo(compressFilePath);4 5             using (FileStream originalFileStream = fileInfo.OpenRead())6             {7                 string currentFileName = fileInfo.FullName;8                 string newFileName = currentFileName.Remove(currentFileName.Length - fileInfo.Extension.Length);9 
10                 using (FileStream decompressedFileStream = File.Create(newFileName))
11                 {
12                     using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
13                     {
14                         decompressionStream.CopyTo(decompressedFileStream);                   
15                     }
16                 }
17             }

2、使用WinRAR

WinRAR提供了一个控制台版本的exe,我们可以调用这个exe来压缩和解压文件

WinRAR支持的格式比较多,包括RAR、7Z、ACE、ARJ、BZ2、CAB、GZ、ISO、JAR、LZH、TAR、UUE、XZ、Z、001

这个exe不依赖其它的库,这里我们直接拷到项目的运行目录下

Rar.exe支持的命令参数非常多,这里不全部介绍。有兴趣的可以运行Rar -?查看详细的命令说明

创建rar压缩文件

语法如下:Rar.exe a "D:\test.rar" "D:\test"

 1  static void Main(string[] args)2         {3             const string RARToolName = "Rar.exe";        //Rar命令行exe4             string compressionFileName = "D:\\test.rar"; //压缩后的文件名5             string sourceFolderName = "D:\\test";        //要压缩的文件夹6 7             Process p = new Process();8             ProcessStartInfo startInfo = new ProcessStartInfo();9             startInfo.FileName = RARToolName;
10             startInfo.CreateNoWindow = false;
11             startInfo.UseShellExecute = false;
12             startInfo.Arguments = string.Format("{0} {1} {2}","a",compressionFileName,sourceFolderName);
13             p.StartInfo = startInfo;
14             p.Start();
15         }

运行结果如下

打开D盘,会看到test.rar

解压Rar压缩文件

语法如下:Rar.exe x "D:\test.rar" "D:\test"

 1 const string RARToolName = "Rar.exe";        //Rar命令行exe2             string compressionFileName = "D:\\test.rar"; //指定压缩文件名3             string sourceFolderName = "D:\\test";   //要解压到的文件夹4 5             Process p = new Process();6             ProcessStartInfo startInfo = new ProcessStartInfo();7             startInfo.FileName = RARToolName;8             startInfo.CreateNoWindow = false;9             startInfo.UseShellExecute = false;
10             startInfo.Arguments = string.Format("{0} {1} {2}","x",compressionFileName,sourceFolderName);
11             p.StartInfo = startInfo;
12             p.Start();

这里还有一个操作,就是可以把图片和RAR压缩文件合并成一个文件

首先准备一个RAR文件,一个图片文件

 1   static void Main(string[] args)2         {3             string imageFilePath = "D:\\2.jpg";            //图片文件路径4             string rarFilePath = "D:\\test.rar";           //压缩文件路径5             string command = string.Format("copy /b {0} + {1} = {0}",imageFilePath,rarFilePath);  //命令6 7             Process p = new Process();8             ProcessStartInfo startInfo = new ProcessStartInfo();9             startInfo.FileName = "cmd.exe";
10             startInfo.UseShellExecute = false;    
11             startInfo.CreateNoWindow = false;
12             startInfo.RedirectStandardInput = true;
13             startInfo.RedirectStandardOutput = true;
14             p.StartInfo = startInfo;          
15             p.Start();
16             p.StandardInput.WriteLine(command + "&exit");
17             p.StandardInput.AutoFlush = true;      
18             p.WaitForExit();
19             p.Close();
20             Console.WriteLine("执行成功");
21 }

执行完成后,会发现图片文件变大了

此时我们只要将文件后缀修改为.rar,就可以以压缩文件的方式打开该文件。修改为.jpg,可以正常打开图片。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/399856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构】---Queue

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 前言队列Queue队列的模拟…

机器学习——第十一章 特征选择与稀疏学习

11.1 子集搜索与评价 对一个学习任务来说,给定属性集,其中有些属性可能很关键、很有用,另一些属性则可能没什么用.我们将属性称为"特征" (feature) ,对当前学习任务有用的属性称为"相关特征" (relevant featu…

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版,80级,5人副本古达克,科技队伍(BUG队伍) 副本有两个门口 这样看,是不是觉得很怪。是的,和图1刚好相反的。 因此应该翻转180…

Ubuntu视频工具

1. VLC VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光…

《学会 SpringBoot · 优雅停机方案》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

深入了解ISO 10012测量管理体系:从认证流程到实施周期

ISO 10012测量管理体系是国际标准化组织(ISO)推出的一项关键标准,旨在帮助企业确保测量过程的精确性和一致性。这个标准对需要精密测量的行业,如制造业、科学研究等领域尤为重要。了解ISO 10012的认证流程和实施周期,对…

Python数据可视化案例——折线图

目录 json介绍: Pyecharts介绍 安装pyecharts包 构建一个基础的折线图 配置全局配置项 综合案例: 使用工具对数据进行查看 : 数据处理 json介绍: json是一种轻量级的数据交互格式,采用完全独立于编程语言的文…

R的行和列命名和类型的转换

下面内容摘录自: 4章8节:用R做数据重塑,行列命名和数据类型转换-CSDN博客 欢迎订阅我们专栏 一、行和列命名 在数据科学和统计分析中,命名是组织和管理数据的一个重要部分。尤其是在处理复杂的多维数据集时,为行和列命…

HAProxy负载均衡详细解释

目录 1、HAProxy的负载均衡 1.1socat工具的使用 1.1.1对于单进程 1.1.2对于多进程处理方法(对haproxy做热处理) 2、Haproxy的算法 2.1静态算法 <1>static-rr <2>first 2.2动态算法 <1>roundrobin <2>leastconn <3>random 2.3其他算…

OpenGL3.3_C++_Windows(35)

PBR_IBL漫反射 IBL图像的光照(Image based lighting&#xff09;&#xff1a;非直接光源&#xff0c;它是一种更精确的环境光照输入格式&#xff0c;甚至也可以说是一种全局光照的粗略近似。环境光照&#xff1a;获取每个wi光源辐射率&#xff0c;求辐照度&#xff1a;将周围环…

手机IP地址:是根据网络还是设备决定的?

在日益数字化的今天&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。它不仅是我们沟通的桥梁&#xff0c;更是我们获取信息、享受娱乐和完成工作的得力助手。然而&#xff0c;在使用手机上网的过程中&#xff0c;你是否曾经好奇过手机的IP地址是如何被分配的&#xf…

浅谈C语言位段

1、位段的定义 百度百科中是这样解释位段的: 位段&#xff0c;C语言允许在一个结构体中以位为单位来指定其成员所占内存长度&#xff0c;这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 以下&#xff0c;我们均在VS2022的…

Llama 3.1中文微调数据集已上线,超大模型一键部署

7 月的 AI 圈真是卷完小模型卷大模型&#xff0c;精彩不停&#xff01;大多数同学都能体验 GPT-4o、Mistral-Nemo 这样的小模型&#xff0c;但 Llama-3.1-405B 和 Mistral-Large-2 这样的超大模型让很多小伙伴犯了难。 别担心&#xff01;hyper.ai 官网在教程板块为大家提供了…

创建第一个Qt项目

创建第一个QT项目 创建工程名称一般不要有特殊符号&#xff0c;不要有中文 项目工程保存路径可修改&#xff0c;路径不要带中文 Base class中的三个选项 QMainWindow:主窗口类&#xff0c;包括菜单栏、工具栏、状态栏。 QWidget:可以创建一个空白的窗口&#xff0c;是所有界…

SQL Server 2022的索引

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 10.1 索引的含义…

【C++ 面试 - 基础题】每日 3 题(十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

C# Winform序列化和反序列化

在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化&#xff0c;为解决此问题&#xff0c;采用System.Text.Json进行序列化&#xff0c;注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …

《剑指offer》题目 C++详细题解

JZ15 二进制中1的个数 核心考点&#xff1a;二进制计算 思路一&#xff1a;使用一个循环&#xff0c;因为我们知道整型变量只有32位&#xff0c;所以循环结束的条件就是到32&#xff0c;从最低位开始&#xff0c;逐位检查数字 n 的二进制表示&#xff0c;利用位运算中的与运算…

如何检查端口占用:netstat和lsof指令

在网络故障排查和系统管理中&#xff0c;检查端口占用情况是一项常见且重要的任务。本文将详细介绍如何使用 netstat 和 lsof 这两个强大的工具来检查端口占用和相关服务。 1. 使用 netstat 查看端口占用 netstat (network statistics) 是一个用于显示网络连接、路由表、接口…

前端react集成OIDC

文章目录 OpenID Connect (OIDC)3种 授权模式 【服务端】express 集成OIDC【前端】react 集成OIDCoidc-client-js库 原生集成react-oidc-context 库非组件获取user信息 OAuth 2.0 协议主要用于资源授权。 OpenID Connect (OIDC) https://openid.net/specs/openid-connect-core…