首页 > 系统相关 >使用C#在Windows上压缩文件

使用C#在Windows上压缩文件

时间:2023-10-09 23:16:09浏览次数:35  
标签:Console string C# 压缩文件 Windows compressedInformation public 压缩包

使用C#通过Zip实现文件的压缩

可以设置输出文件的路径也可以留空,留空则会在压缩文件创建一个同名的.压缩包
可以设置压缩包的密码
可以设置压缩包的加密方式(ASE-256),可以使用LZMA但是加密码会报错
可以设置压缩包的格式(zip),可以使用7z但是加密码会报错
添加了密码最大长度的限制(98个字符,7zip限制的)

 using System;
using System.Diagnostics;

namespace 文件的压缩
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("你好,接下来开始压缩文件");

            ZipsHelper.CompressedInformation compressedInformation = new ZipsHelper.CompressedInformation(
               @"E:\压缩文件测试\压缩文件_Orgion\V_1696602827.txt",
               "",
                "",
               ZipsHelper.CompressedFileType.Zip,
               ZipsHelper.CompressedPackageEncryptionMode.AES256);
            //压缩  E:\压缩文件测试\压缩文件_Orgion\V1696602827.txt
            //到     E:\压缩文件测试\压缩文件_Orgion\V1696602827.zip

            ZipsHelper.DoCompressedFile(compressedInformation);

            Console.ReadKey();

        }
    }

    /// <summary>
    /// zip文件压缩
    /// </summary>
    public class ZipsHelper
    {

        /// <summary>
        /// 压缩文件
        /// </summary>
        public static void DoCompressedFile(CompressedInformation compressedInformation)
        {
            // 设置7-Zip可执行文件的路径,根据你的安装路径进行修改
            string sevenZipExePath = @"C:\Program Files\7-Zip\7z.exe";
            if (!System.IO.File.Exists(sevenZipExePath))
            {
                Console.WriteLine($"未能找到7z.exe ,请检查路径,当前路径是:{sevenZipExePath}");
                return;
            }
           if (compressedInformation.Password.Length > 98)
            {
                Console.WriteLine($"压缩取消,密码长度过长,最大长度是98,当前长度是:{compressedInformation.Password.Length}。");
                return;
            }
            string encryptionMethod;//压缩包的加密方式
            if (compressedInformation.CompressedPackageEncryptionMode == CompressedPackageEncryptionMode.AES256)
            {
                encryptionMethod = "-mem=AES256";
            }
            //else if (compressedInformation.CompressedPackageEncryptionMode == CompressedPackageEncryptionMode.LZMA)
            //{
            //encryptionMethod = "-mhe=on -m0=BCJ2 -m1=LZMA2 -m2=LZMA2 -m3=LZMA2 -mb0:1 -mb0s1:2 -mb0s2:3";
            //}
            else
            {
                encryptionMethod = "-mem=AES256";
            }

            string format;//设置压缩包的格式
            if (compressedInformation.CompressedFileType == CompressedFileType.Zip)
            {
                compressedInformation.CompressedFilePath += ".zip";//添加压缩包的文件后缀
                format = "zip";
            }
            else
            {
                format = "7z";
            }

            string arguments;//压缩的参数
            //构建7-Zip命令行参数 
            if (compressedInformation.Password == "")//当选择了压缩的加密方式但是密码为空的时候不能压缩
            {
                arguments = $"a -t{format} \"{compressedInformation.CompressedFilePath}\" \"{compressedInformation.FilePathToCompress}\"";
            }
            else
            {
                arguments = $"a -t{format} \"{compressedInformation.CompressedFilePath}\" \"{compressedInformation.FilePathToCompress}\" {encryptionMethod} -p{compressedInformation.Password}";
            }


            Console.WriteLine(arguments);

            // 创建一个新的进程来运行7-Zip
            Process process = new Process();
            process.StartInfo.FileName = sevenZipExePath;
            process.StartInfo.Arguments = arguments;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.CreateNoWindow = true;

            // 启动7-Zip进程并等待其完成
            process.Start();
            process.WaitForExit();

            // 处理输出结果
            string output = process.StandardOutput.ReadToEnd();
            string error = process.StandardError.ReadToEnd();

            if (string.IsNullOrEmpty(error))
            {
                Console.WriteLine("文件压缩成功!");
            }
            else
            {
                Console.WriteLine("文件压缩失败,错误信息:" + error);
            }

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine(output);


        }


        /// <summary>
        /// 压缩包类型
        /// </summary>
        public enum CompressedFileType
        {
            Zip = 1,
            //  _7Z = 2

        }

        /// <summary>
        /// 压缩包加密格式
        /// </summary>
        public enum CompressedPackageEncryptionMode
        {
            AES256,
            //  LZMA,
        }


        public class CompressedInformation
        {
            /// <summary>
            /// 压缩文件路径
            /// </summary>
            private string filePathToCompress;

            /// <summary>
            /// 输出文件路径
            /// </summary>
            private string compressedFilePath;

            /// <summary>
            /// 密码
            /// </summary>
            private string password;

            /// <summary>
            /// 压缩包类型
            /// </summary>
            private CompressedFileType compressedFileType;


            /// <summary>
            ///  压缩包加密格式
            /// </summary>
            private CompressedPackageEncryptionMode compressedPackageEncryptionMode;

            public string FilePathToCompress { get => filePathToCompress; set => filePathToCompress = value; }
            public string CompressedFilePath { get => compressedFilePath; set => compressedFilePath = value; }
            public string Password { get => password; set => password = value; }
            public CompressedFileType CompressedFileType { get => compressedFileType; set => compressedFileType = value; }
            public CompressedPackageEncryptionMode CompressedPackageEncryptionMode { get => compressedPackageEncryptionMode; set => compressedPackageEncryptionMode = value; }

            /// <summary>
            /// 压缩命令参数
            /// </summary>
            /// <param name="filePathToCompress">压缩文件路径</param>
            /// <param name="compressedFilePath">压缩包输出路径</param>
            /// <param name="password">密码</param>
            /// <param name="compressedFileType">压缩包格式</param>
            /// <param name="compressedPackageEncryptionMode">压缩包加密方式</param>
            public CompressedInformation(string filePathToCompress,
                string compressedFilePath = "",
                string password = "",
                CompressedFileType compressedFileType = CompressedFileType.Zip,
                CompressedPackageEncryptionMode compressedPackageEncryptionMode = CompressedPackageEncryptionMode.AES256)
            {
                this.FilePathToCompress = filePathToCompress;
                this.CompressedFilePath = compressedFilePath;
                this.Password = password;
                this.CompressedFileType = compressedFileType;
                this.CompressedPackageEncryptionMode = compressedPackageEncryptionMode;

                if (compressedFilePath == "")
                {
                    GetFileNameAndExtension(filePathToCompress, out compressedFilePath);
                    this.CompressedFilePath = compressedFilePath;
                }
            }

            public static void GetFileNameAndExtension(string filePath, out string pathWithoutExtension)
            {
                pathWithoutExtension = System.IO.Path.ChangeExtension(filePath, null); // 去除文件后缀
            }


        }

    }

}


标签:Console,string,C#,压缩文件,Windows,compressedInformation,public,压缩包
From: https://www.cnblogs.com/goodcooking/p/17753262.html

相关文章

  • CF1877C Joyboard
    思路一个比较明显的结论是,不同的数字个数只可能是\(1,2,3\)。可以随手写一个暴力的输出程序,假定\(n\)和\(m\),把所有可能的序列都输出来,就可以发现这个规律。也可以感性思考一下。如果第\(n+1\)位是\(0\),那么整个序列都会是\(0\),个数也就是\(1\)。如果第\(n+1\)位......
  • phone call
    1.C和C++有什么区别?C++是面向对象的语言,而C是面向过程的语言;C++引入new/delete 运算符,取代了C中的malloc/free 库函数;C++引入引用的概念,而C中没有; C++引入类的概念,而C中没有; C++引入函数重载的特性,而C中没有 2.static关键字有什么作用?修饰局部变量时,使得该变量在静态存储区分配内......
  • 浅谈locust 性能压测使用
    1.基本介绍Locust是一个开源的负载测试工具,用于模拟大量用户并发访问一个系统或服务,以评估其性能和稳定性。编写语言为Python,可通过Python来自定义构建性能压测场景脚本。Locust支持分布式负载测试,可以通过多个机器协同工作来模拟大量用户并发访问。并提供了一个Web界面,可以实......
  • JavaScript
    1可以在任何位置,一般在body后<script>window.alert("JS");//浏览器弹出警告框document.write("HelloJS");//写入html页面中console.log("hellojs")//控制台输出vara=20;//声明全局变量var......
  • AttributeError: module 'tensorflow.compat.v2' has no attribute '__internal__'
     File/home/software/anaconda3/envs/mydlenv/lib/python3.8/site-packages/keras/backend_config.py:3328#Defaultimagedataformat,oneof"channels_last","channels_first".29_IMAGE_DATA_FORMAT="channels_last"......
  • Docker基本使用
     虚拟机:通过虚拟化技术模拟真实的硬件从而创建出来的一台拥有完整功能的逻辑计算机。Docker容器:docker容器也是一种虚拟化技术,和传统虚拟化不一样的是docker只模拟一个程序最核心的运行环境,所以十分小巧,启动更快。Docker虚拟化技术和传统虚拟化技术架构对比:对比特点虚......
  • 【ABC322C】题解
    AtCoderBeginnerContest322ProblemC-Festival题解Meaning-题意简述给定\(N\)和\(M\),还有\(M\)个正整数\(a_1\sima_n\),对于每个\(i\len\),求出\(a\)中第一个大于等于\(i\)的整数和\(i\)的差。Solution-题解思路题目保证\(a\)数组单增,所以就可......
  • 案例2 网络设备初始化及Console端口密码认证
    1.华为设备<Huawei><Huawei>system-view[Huawei]user-interfaceconsole0[Huawei-ui-console0]authentication-modepassword[Huawei-ui-console0]setauthenticationpasswordcipherqytang[Huawei-ui-console0][Huawei-ui-console0]quit[Huawei][Huawe......
  • P7928 [COCI2021-2022#1] Kamenčići
    P7928[COCI2021-2022#1]Kamenčići[P7928COCI2021-2022#1]Kamenčići-洛谷|计算机科学教育新生态(luogu.com.cn)目录P7928[COCI2021-2022#1]Kamenčići题目大意思路code题目大意Alice和Bob又在玩游戏。在他们面前有\(n\)块石头排成一行,石头有红和蓝两种颜......
  • CS144-lab0
    Checkpoint0Writeup该lab要实现一个字节流,兼具写入和读出的能力,并且buffer空间受限。根据要实现的函数和读写功能,内部要存储的成员为std::queue<std::string>buffer_{};用于存储写入的字符串(原本用的std::queue,但由于queue内存不连续,调用peek返回string_view时还要将cha......