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

news2024/11/13 15:37:40

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.coloradmin.cn/o/2146829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VBS学习2:问题解决(文件中含义中文运行报错或者中文乱码)

文件中含义中文运行报错或者中文乱码 问题 msgbox"fdsfdsf大蘇打撒旦dsfsdffsdfsd发斯蒂芬斯蒂芬"解决 文件编码修改成GB2312

JAVA开源项目 校园美食分享平台 计算机毕业设计

本文项目编号 T 033 &#xff0c;文末自助获取源码 \color{red}{T033&#xff0c;文末自助获取源码} T033&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

springboot通过tomcat部署项目(包含jar、war两种方式,迄今为止全网最详细!2024更新..建议收藏,教学!万字长文!)

本博客参考的所有文章均已在结尾声明&#xff01;&#xff01;&#xff01; 在 Spring Boot 项目中&#xff0c;有两种常见的部署方式&#xff1a; 1、使用 Spring Boot 自带的 内置 Tomcat&#xff0c;将项目打包为 jar 并直接运行。 2、使用 外置 Tomcat&#xff0c;将项目打…

DHCP服务(relay中继)实验简述

一、DHCP服务&#xff08;relay中继模式&#xff09; 一、配置接入交换机LSW 2 The device is running! sys Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]sysname LSW2 [LSW2]vlan batc…

记录可编辑表格(未完整)

每一行都独立 <el-table-column label"操作" width"220" fixed"right"><template #default"{ row, $index }"><el-buttonv-if"!row.tableEditFlag"type"primary"size"small"click"…

中间件:maxwell、canal

文章目录 1、底层原理&#xff1a;基于mysql的bin log日志实现的&#xff1a;把自己伪装成slave2、bin log 日志有三种模式&#xff1a;2.1、statement模式&#xff1a;2.2、row模式&#xff1a;2.3、mixed模式&#xff1a; 3、maxwell只支持 row 模式&#xff1a;4、maxwell介…

Vue 自定义指令实战

引言 Vue自定义指令是Vue.js框架中强大而灵活的功能之一&#xff0c;它允许开发者根据具体需求创建自定义的指令&#xff0c;以实现更加精细化的交互和数据绑定效果。本文将带你深入探索Vue自定义指令的使用方法、原理和实战&#xff0c;为你打开前端开发的新视野。 我们前面…

2024年汉字小达人区级自由报名备考冲刺:今年官方模拟题练一练

2024年第十一届汉字小达人的区级活动的时间9月25-30日正式开赛&#xff0c;还有一周就开始了。 有一些孩子刚刚被老师通知可以参加这个比赛&#xff0c;担心现在准备汉字小达人比赛是否来得及。根据我的经验&#xff0c;精准备考还是有希望的&#xff0c;也可以把这个比赛当做…

视频怎么提取音频?一键音频提取,视频内容轻松听!

视频怎么提取音频&#xff1f;一键解锁音频世界&#xff0c;让视频精彩不再静默&#xff01;无论您是忙碌于日常工作的上班族&#xff0c;还是热衷于学习的求知者&#xff0c;亦或是享受闲暇时光的聆听者&#xff0c;一键提取音频功能让视频内容瞬间转化为耳畔的温柔低语&#…

51单片机——直流电机驱动

1、直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转。 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&#xff09;和…

Java双端队列ArrayDeque

概述 双端队列ArrayDeque是Java集合框架中的一种数据结构&#xff0c;它实现了Deque接口&#xff0c;因此支持在两端进行添加和移除元素。通过名称也能看出&#xff0c;ArrayDeque是基于数组实现的&#xff0c;ArrayDeque内部使用一个可动态调整大小的环形数组来存储元素。当Ar…

函数递归(上)

目录 1.递归是什么&#xff1f; 1.1 递归的思想&#xff1a; 2.顺序打印⼀个整数的每⼀位 ​编辑3 迭代 4.求第n个斐波那契数 1.递归是什么&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。 #include <stdio.h…

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之扬帆移植案例

标准系统方案之扬帆移植案例 ​ 本文章是基于瑞芯微RK3399芯片的yangfan开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c;WIFI&a…

高效财税自动化软件如何提升企业财务工作的效率与准确性

在当今企业运营中&#xff0c;财务管理发挥着核心作用。它不仅涉及企业正常运转和市场决策&#xff0c;还是推动企业向高质量发展迈进的关键动力。面对激烈的市场竞争与科技革新的双重挑战&#xff0c;财务管理亟需进行持续的转型与提升&#xff0c;为企业高质量发展目标的实现…

vue2.0+ts注册全局函数和几个递归查找

vue2.0ts注册全局函数和几个递归查找 一、main.ts 一、main.ts // 定义你的全局函数,判断是否有按钮权限 interface Item {label: string;checked: number;[k: string]: any; } // 获取按钮时候权限 function globalLable(arr: Item[], label: string): boolean {for (const i…

为大模型提供服务需要多少 GPU 显存?

在几乎所有的 LLM 面试中&#xff0c;有一个问题总是会被提及&#xff1a;“为大模型提供服务需要多少 GPU 显存&#xff1f;” 这不仅仅是一个随机的问题——它是一个关键指标&#xff0c;反映了你对这些强大模型在生产环境中部署和可扩展性的理解程度。 当你使用 GPT、LLaM…

在QSciscintilla编辑器源码中新增关键词分组的方法

由于项目需要&#xff0c;得在QSciscintilla的底层源码中增加几组关键词分组。在网上找了很久&#xff0c;一般都是说利用重写keywords(int set)接口的方式来增加&#xff0c;但这种方法不适用于我的应用场景。因为这种方法只能增加有限个关键词&#xff0c;且都是直接写死的方…

风电出海内幕:黄金期和内卷期共存

间歇性停战&#xff0c;持续性内卷&#xff0c;这就是中国风电。 9月4日&#xff0c;中国可再生能源学会风能专业委员会秘书长秦海岩发布文章《穿越周期&#xff0c;跨过险阻&#xff0c;中国风电的征途仍是星辰大海》。文章指出&#xff0c;中国风电行业正在重现十多年前的恶…

高中数学:立体几何-空间中点、直线、平面之间的位置关系

文章目录 1、空间中直线与直线的位置关系1、平行线传递性质2、定理3、空间直线夹角 2、空间中直线与平面的位置关系1、线面平行2、线面垂直 3、空间中平面与平面的位置关系1、面面平行2、二面角&#xff08;面与面的夹角&#xff09;3、面面垂直 4、补充 1、空间中直线与直线的…