C# 携手 7-Zip 命令行:大文件压缩的终极武器?

image

前言

嗨,大家好!

今天咱们来聊聊如何用 C# 调用 7-Zip 命令行来压缩大文件,这是个既高效又稳定的好办法,亲测有效!

在实际工作中,压缩文件几乎是家常便饭,但可惜的是,许多常用的方法并不如我们所愿,稍不注意,就会踩 “坑”,我以前就踩了不少 “坑”,比如说:

  1. 用 C# 内置的压缩方法,效率低不说,资源占用还高,尤其是一旦文件超过 2GB 就会频繁出错,而且,它的功能简单得可怜,对于复杂的需求(比如分卷压缩、加密等)几乎无能为力。

  2. 我还尝试过使用 NuGet 上的第三方库(比如 ZipStorer),但是没想到一旦文件总大小超过 4G,压缩出来的文件常常有各种奇奇怪怪的问题,根本解压不了!

幸运的是,我后来选择直接使用 7-Zip 的命令行来压缩文件。

结果令人惊喜:不仅压缩速度极快,而且输出文件的稳定性也大幅提升,完全不用担心解压问题。

下面就让我来分享一下具体的操作步骤吧!

Step By Step 代码

  1. 编写一个打开 CMD 窗口执行一段命令行脚本的方法

    public static class CommandUtil
    {/// <summary>/// 调用 CMD 窗口执行一段命令行脚本/// </summary>/// <param name="commandLine">命令行脚本</param>/// <param name="errorMsg">错误消息</param>/// <param name="errorMsg">输出消息</param>/// <returns>返回命令执行是否成功状态</returns>public static bool ExecuteCmdCommand(string commandLine, ref string errorMsg, ref string outputMsg){bool Flag = false;Process proc = new Process();try{// 配置CMD窗口的启动信息proc.StartInfo.FileName = "cmd.exe";proc.StartInfo.UseShellExecute = false;	// 不使用操作系统的外部程序proc.StartInfo.RedirectStandardInput = true;// 开启重定向输入proc.StartInfo.RedirectStandardOutput = true;// 开启重定向输出proc.StartInfo.RedirectStandardError = true;// 开启重定向错误输出proc.StartInfo.CreateNoWindow = true;	// 不创建窗口proc.Start();proc.StandardInput.WriteLine(commandLine);// 写入命令proc.StandardInput.WriteLine("exit");// 完成后退出errorMsg = proc.StandardError.ReadToEnd();// 捕获错误信息outputMsg = proc.StandardOutput.ReadToEnd();// 捕获输出信息proc.WaitForExit();								// 等待进程退出if (proc.ExitCode == 0){Flag = true;}proc.StandardError.Close();}catch (Exception ex){throw;}finally{proc.Close();proc.Dispose();}return Flag;}
    }	
    
  2. 创建一个封装调用 7-Zip 的密封类

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Common.Util;namespace ZipCommon
    {public sealed class SevenZipUtil{/// <summary>/// 压缩方法/// </summary>/// <param name="cmdFormat">命令行脚本</param>/// <param name="sourceFolder">源文件目录</param>/// <param name="outZipFile">要输出的压缩文件</param>/// <returns></returns>private static void ZipUsing7zip(string cmdFormat, string sourceFolder, string outZipFile){try{// 找到 7z.exe 的路径string zipExePath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "bin", "7-zip", "7z.exe");// 获取要压缩的文件string filesPath = Path.Combine(sourceFolder, "*");// 格式化命令string cmd = string.Format(cmdFormat, zipExePath, outZipFile, filesPath);// 调用 7-Zip 执行命令string errorMsg = "";string outputMsg = "";bool cmdResult = CommandUtil.ExecuteCmdCommand(cmd, ref errorMsg, ref outputMsg);if (!cmdResult){string exceptionMsg = "压缩文件时发生错误。";if (!string.IsNullOrWhiteSpace(errorMsg)) exceptionMsg = string.Format("{0} [{1}]", exceptionMsg, errorMsg);throw new Exception(exceptionMsg);}}				catch (Exception ex)				{					throw new Exception("压缩文件时发生错误。", ex);				}			}/// <summary>			/// 压缩方法(单文件夹)			/// </summary>			/// <param name="sourceFolder">源文件目录</param>			/// <param name="outZipFile">要输出的压缩文件</param>			/// <returns></returns>			public static void ZipLargeFiles(string sourceFolder, string outZipFile)			{				try				{					string cmdFormat = "\"{0}\" a -tzip -mx=0 -mmt=on \"{1}\" \"{2}\"";					ZipUsing7zip(cmdFormat, sourceFolder, outZipFile);				}				catch				{					throw;				}			}/// <summary>			/// 压缩方法(文件字典集合)			/// </summary>			/// <param name="fileList">文件字典集合</param>/// <param name="outZipFile">要输出的压缩文件</param>			/// <returns></returns>			public static void ZipLargeFiles(Dictionary<string, string> fileList, string outZipFile)			{				try				{					// 1. 创建一个临时目录用来存放文件字典集合里的文件					string tempDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tmp_dir", "zipping", DateTime.Now.ToString("yyyyMMddHHmmssffffff"));					if (!Directory.Exists(tempDir)) Directory.CreateDirectory(tempDir);// 2. 拷贝文件字典集合里的文件到临时目录					foreach (KeyValuePair<string, string> filepath in fileList)					{						File.Copy(filepath.Key, Path.Combine(tempDir, filepath.Value));					}// 3. 调用 7-Zip 压缩文件					string cmdFormat = "\"{0}\" a -tzip -mx=0 -mmt=on \"{1}\" \"{2}\" -sdel";					ZipUsing7zip(cmdFormat, tempDir, outZipFile);// 4. 删除临时目录					Directory.Delete(tempDir, true);				}				catch				{					throw;				}			}		}	
    }
    
  3. 使用

    // 待压缩文件目录
    var filespath = @"D:\largeFile";// 压缩后输出的压缩文件
    var outfile = @"D:\ZipTest\largeFile.zip";// 调用压缩方法
    SevenZipUtil.ZipLargeFiles(filespath, outfile);
    
  4. 注意事项

    • 确保项目在编译时将 7z.exe 一起输出到 bin 目录,以防缺失文件导致程序出错。

7-Zip 命令参数说明

解释一下以上命令行里的参数:

  • a:添加文件到压缩包里。
  • -tzip:指定压缩类型为 zip,这是操作系统内置支持的格式,此外还可以设置为其他格式如 7z、gzip 等。
  • -mx=0:设置压缩级别为 0,表示复制模式(无压缩),以获得最快的压缩速度。
  • -mmt=on:启用多线程模式,适用于多处理器或多核系统,以提高压缩速度。
  • -sdel:设置压缩后删除源文件。

总结

使用 7-Zip 命令行来压缩文件,不仅效率更高,而且稳定性更强。

7-Zip 命令行支持多线程,可以充分利用多核处理器的优势,同时提供了多种压缩格式的选择,让你可以根据实际情况灵活调整。无论是处理超大文件还是复杂需求,它都能轻松应对。

总的来说,7-Zip 的命令行工具就像是压缩界的瑞士军刀,功能强大且灵活多样。如果你还在为大文件的压缩头疼,不妨试试这个方法,相信它会让你的工作变得更加高效便捷!

最后,希望这个小技巧能帮你提升工作效率,如果你有更好的经验分享,欢迎留言讨论!

往期精彩

  1. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  2. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,和你共同探索代码世界的奥秘!
image

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

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

相关文章

【科技论文写作与发表】论文分类

目录 一、实验性论文特点写作结构适用学科方向 二、报道性论文特点写作结构适用学科方向 三、理论性论文特点写作结构适用学科方向 一、实验性论文 通过科学实验获得的数据和结果进行详细阐述和分析&#xff0c;检验某一科学理论或假说。 特点 详细描述实验目的、实验设计、实…

ORM框架详解:为什么不直接写SQL?

想象一下&#xff0c;你正在开发一个小型的在线书店应用。你需要存储书籍信息、用户数据和订单记录。作为一个初学者&#xff0c;你可能会想&#xff1a;“我已经学会了SQL&#xff0c;为什么还要使用ORM框架呢&#xff1f;直接写SQL语句不是更简单、更直接吗&#xff1f;” 如…

Uniapp的alertDialog返回值+async/await处理确定/取消问题

今天在使用uniui的alertDialog时&#xff0c;想添加一个确定/取消的警告框时 发现alertDialog和下面的处理同步进行了&#xff0c;没有等待alaertDialog处理完才进行 查询后发现问题在于 await 关键字虽然被用来等待 alertDialog.value.open() 的完成&#xff0c;但是 alertDi…

前端mock了所有……

目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提&#xff1a; 事情是这样的&#xff0c;老板想要我们写一个demo拿去路演/拉项目&#xff0c;有一些数据&#xff0c;希望前端接一下&#xff0c;写几个表格&a…

vs code 跳转很慢

查看结构体、接口等非常之慢。c/c语言服务功能使用了智能引擎所致&#xff0c;设置为模糊检索即可。 修改如下&#xff1a; 1.打开"文件"&#xff0c;选"首选项"&#xff0c;"设置" 2.弹出的窗口中搜索 "C_Cpp.intelliSenseEngine" …

TCP客户端编码和解码处理:发送和接收指定编码消息

文章目录 引言基于Netty实现TCP客户端Netty发送GBK编码指令Netty接收GBK编码基于Channel发送指令基于ChannelHandlerContext发送指令:建立连接时发送登陆指令开启日志,查看报文信息基于ChannelInboundHandlerAdapter进行业务逻辑处理原生API实现TCP客户端基于DataOutputStrea…

C语言 | Leetcode C语言题解之题409题最长回文串

题目&#xff1a; 题解&#xff1a; int longestPalindrome(char * s) {int c[128]{0},ret0;for(int i0;i<strlen(s);i){c[s[i]];}for(int i0;i<128;i){retc[i]-c[i]%2;}return ret(ret!strlen(s)); }

gazebo 仿真阶段性问题汇总二

目录 写在前面的话遇到的问题问题一&#xff1a;启动了多个 robot_state_publisher解决办法 问题二&#xff1a;rviz 启动报错解决办法 问题三&#xff1a;rviz 中 wheel 一直指向 base_link解决方法 问题四&#xff1a;摄像头和opencv坐标系的问题解决方法 问题五&#xff1a;…

JavaWeb笔记整理——Redis

目录 Redis数据类型 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在Java中操作Redis Spring Data Redis的使用方式 操作字符串类型的数据 ​编辑操作hash类型的数据 ​编辑 操作列表类…

Rasa对话模型——做一个语言助手

1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架&#xff0c;主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解&#xff08;NLU&#xff09;和对话管理&#xff08;DM&#xff09;功能&#xff0c;使开发者能够创建智能、交互式的对话系统。 1.2…

《中国数据库前世今生》纪录片观感:从古至今数据库的演变与未来

我的数据库之路&#xff1a;从新手到稳步前行 三年数据库开发的经历&#xff0c;让我从一名菜鸟程序员逐步成长为能够独立解决问题的开发者。这段时间里&#xff0c;我经历过迷茫、困惑&#xff0c;也感受过技术攻关后的成就感。最近看了腾讯云推出的《中国数据库前世今生》纪…

ARM相关概念

ARM课程大纲 ARM相关的基本概念 机器码 计算机能够识别由1和0组成的编码格式 汇编&#xff1a;将汇编文件转换为二进制文件&#xff08;.bin/.elf&#xff09; 汇编指令 是一条具备特殊功能的指令 编译&#xff1a;生成汇编文件 int a 10; ------> mov r0 #10 …

架构师:在 Spring Cloud 中实现全局异常处理的技术指南

1、简述 在分布式系统中,微服务架构是最流行的设计模式之一。Spring Cloud 提供了各种工具和库来简化微服务的开发和管理。然而,随着服务的增多,处理每个服务中的异常变得尤为复杂。因此,实现统一的全局异常处理成为了关键。本篇博客将介绍如何在 Spring Cloud 微服务架构…

Docker日志管理

ELK Filebeat Filebeat 是 ELK 组件的新成员&#xff0c; 也是 Beat 成员之一。基于 Go 语言开发&#xff0c; 无任何依赖&#xff0c; 并且比 Logstash 更加轻量&#xff0c; 不会带来过高的资源占用&#xff0c; 非常适合安装在生产机器上。轻量意 味着简单&#xff0c;Fileb…

51单片机-DA(数字转模拟)

作者&#xff1a;Whappy 个人理解&#xff1a;将电压或电流信号进行等分或不等分&#xff08;高电平的电压范围和低电平的范围&#xff0c;如0-5v&#xff0c;0-1.8位低电平&#xff0c;3.8-5v为高电平&#xff09;&#xff0c;同样也是通过采样&#xff0c;量化等操作将不连续…

苍穹外卖Day01-2

目录 导入接口文档 创建项目​编辑 导入接口文件 ​编辑 导入结果界面​编辑 Swagger 介绍 如何集成 Swagger&#xff1f; 1.添加依赖 2.配置 Swagger 3.创建 Swagger 配置类 4.使用注解生成文档 5.访问 Swagger UI 6.Swagger 的优势 导入接口文档 yApi接口管理平台h…

Oracle从入门到放弃

Oracle从入门到放弃 左连接和右连接Where子查询单行子查询多行子查询 from子句的子查询select子句的子查询oracle分页序列序列的应用 索引PL/SQL变量声明与赋值select into 赋值变量属性类型 异常循环游标存储函数存储过程不带传出参数的存储过程带传出参数的存储过程 左连接和…

【数据结构】排序算法系列——堆排序(附源码+图解)

堆排序 堆排序基于一种常见的**[[二叉树]]结构**&#xff1a;堆 我们前面讲到选择排序&#xff0c;它在待排序的n个记录中选择一个最小的记录需要比较n一1次。本来这也可以理解&#xff0c;查找第一个数据需要比较这么多次是正常的&#xff0c;否则无法知道它是最小的记录。 …

BCLinux您的授权码是无效的,请获得正确的授权码来注册大云Linux操作系统

更新yum源老弹出这个&#xff0c;很烦人。 [rootlocalhost yum.repos.d]# yum clean all 服务器检查结果: ***信息***您的授权码是无效的&#xff0c;请获得正确的授权码来注册大云Linux操作系统。您可以使用bclinux-license -g命令获得机器码&#xff0c;然后与我们联系帮您产…

网络安全:建筑公司会计软件遭受暴力攻击

黑客正在暴力破解基金会会计服务器上高权限账户的密码&#xff0c;这些账户广泛用于建筑行业&#xff0c;从而侵入企业网络。 这一恶意活动最先被 Huntress 发现&#xff0c;其研究人员于 2024 年 9 月 14 日检测到了此次攻击。 Huntress 已经发现这些攻击对管道、暖通空调、…