LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 创建RAR、ZIP压缩文件方法

admin
2025年7月21日 13:24 本文热度 65

在工作中,RARZIP是两种最常用的压缩文件格式,主要用于文件打包、压缩和传输。它们能显著减少文件体积、提高存储效率,并便于数据共享和备份。 

压缩文件的用途如下:
  • 文件压缩与存储优化:通过算法减小文件体积,节省磁盘空间或网络带宽。

  • 数据传输与共享:加快文件上传/下载速度,降低传输失败风险。

  • 文件加密与安全:通过密码保护敏感数据,防止未授权访问。

  • 分卷压缩(大文件拆分):将大文件分割成多个小包,绕过存储或传输限制。

  • 自解压文件(无需解压软件):生成自己的.exe应用程序,方便接收方直接运行解压。

下面介绍如何通过编程创建或解压文件:

1、调用Winrar.exe压缩工具创建rar或zip压缩文件;本方法借助于Winrar.exe工具压缩、解压RAR、ZIP文件;
bool RetState = false;string SourceFileDir = "数据源目录";string SaveZipFilePath = "rar\zip文件路径";string SaveFileDir = "解压目录";
//(1)、带密码压缩CompressRarOrZip(SourceFileDir, SaveZipFilePath, false"123");/// <summary>/// 压缩RAR文件/// 注:需先安装Winrar.exe压缩工具;/// </summary>/// <param name="SourceFilesPath">源文件目录</param>/// <param name="RarSaveFilePath">保存文件路径,包含扩展名</param>/// <param name="IsCover">所压缩文件是否会覆盖已有的压缩文件(如果不覆盖,所压缩文件和已存在的相同名称的压缩文件不会共同存在,只保留原已存在压缩文件)</param>/// <param name="PassWord">压缩密码(如果不需要密码则为空)</param>/// <returns>true(压缩成功);false(压缩失败)</returns>public bool CompressRarOrZip(string SourceFilesPath, string RarSaveFilePath, bool IsCover, string PassWord){    string rarPath = Path.GetDirectoryName(RarSaveFilePath);    if (!Directory.Exists(rarPath))        Directory.CreateDirectory(rarPath);    Process Process1 = new Process();    Process1.StartInfo.FileName = "Winrar.exe";    Process1.StartInfo.CreateNoWindow = true;    string cmd = "";    if (!string.IsNullOrEmpty(PassWord) && IsCover)        //压缩加密文件且覆盖已存在压缩文件( -p密码 -o+覆盖 )        cmd = string.Format(" a -ep1 -p{0} -o+ {1} {2} -r", PassWord, RarSaveFilePath, SourceFilesPath);    else if (!string.IsNullOrEmpty(PassWord) && !IsCover)        //压缩加密文件且不覆盖已存在压缩文件( -p密码 -o-不覆盖 )        cmd = string.Format(" a -ep1 -p{0} -o- {1} {2} -r", PassWord, RarSaveFilePath, SourceFilesPath);    else if (string.IsNullOrEmpty(PassWord) && IsCover)        //压缩且覆盖已存在压缩文件( -o+覆盖 )        cmd = string.Format(" a -ep1 -o+ {0} {1} -r", RarSaveFilePath, SourceFilesPath);    else        //压缩且不覆盖已存在压缩文件( -o-不覆盖 )        cmd = string.Format(" a -ep1 -o- {0} {1} -r", RarSaveFilePath, SourceFilesPath);    //命令    Process1.StartInfo.Arguments = cmd;    Process1.Start();    Process1.WaitForExit();//无限期等待进程 winrar.exe 退出    //Process1.ExitCode==0指正常执行,Process1.ExitCode==1则指不正常执行    if (Process1.ExitCode == 0)    {        Process1.Close();        return true;    }    else    {        Process1.Close();        return false;    }}
//(2)、带密码解压DecompressRarOrZip(SaveFileDir, SaveZipFilePath, false"123");/// <summary>/// 解压RAR和ZIP文件/// 注:需先安装Winrar.exe压缩工具;/// </summary>/// <param name="FileSaveDir">解压后保存目录</param>/// <param name="RarFilePath">解压文件路径</param>/// <param name="IsCover">所解压的文件是否会覆盖已存在的文件(如果不覆盖,所解压出的文件和已存在的相同名称文件不会共同存在,只保留原已存在文件)</param>/// <param name="PassWord">解压密码(如果不需要密码则为空)</param>/// <returns>true(解压成功);false(解压失败)</returns>public bool DecompressRarOrZip(string FileSaveDir, string RarFilePath, bool IsCover, string PassWord){    if (!Directory.Exists(FileSaveDir))        Directory.CreateDirectory(FileSaveDir);    Process Process1 = new Process();    Process1.StartInfo.FileName = "Winrar.exe";    Process1.StartInfo.CreateNoWindow = true;    string cmd = "";    if (!string.IsNullOrEmpty(PassWord) && IsCover)        //解压加密文件且覆盖已存在文件( -p密码 )        cmd = string.Format(" x -p{0} -o+ {1} {2} -y", PassWord, RarFilePath, FileSaveDir);    else if (!string.IsNullOrEmpty(PassWord) && !IsCover)        //解压加密文件且不覆盖已存在文件( -p密码 )        cmd = string.Format(" x -p{0} -o- {1} {2} -y", PassWord, RarFilePath, FileSaveDir);    else if (IsCover)        //覆盖命令( x -o+ 代表覆盖已存在的文件)        cmd = string.Format(" x -o+ {0} {1} -y", RarFilePath, FileSaveDir);    else        //不覆盖命令( x -o- 代表不覆盖已存在的文件)        cmd = string.Format(" x -o- {0} {1} -y", RarFilePath, FileSaveDir);    //命令    Process1.StartInfo.Arguments = cmd;    Process1.Start();    Process1.WaitForExit();//无限期等待进程 winrar.exe 退出    //Process1.ExitCode==0指正常执行,Process1.ExitCode==1则指不正常执行    if (Process1.ExitCode == 0)    {        Process1.Close();        return true;    }    else    {        Process1.Close();        return false;    }}

2、使用三方类库ICSharpCode.SharpZipLib创建ZIP压缩文件:

特点:不依赖于PC是否有Winrar.exe压缩工具,引用动态库DLL创建,请自行下载DLL引用文件:ICSharpCode.SharpZipLib.dll
 bool RetState = false;string SourceFileDir = "数据源目录";string SaveZipFilePath = "zip文件路径";string SaveFileDir = "解压目录";

//压缩调用方法CreateZipFile(SourceFileDir, SaveZipFilePath);
/// <summary>/// 压缩多层目录文件/// 注:不包含最外层文件夹,只针对内容;/// </summary>/// <param name="SourceFileDir">源文件目录</param>/// <param name="SaveZipFilePath">保存ZIP文件路径,包含扩展名</param>/// <param name="IsShowDialog">是否显示进度提示框,默认不显示</param>/// <returns></returns>public bool CreateZipFile(string SourceFileDir, string SaveZipFilePath, bool IsShowDialog = false){    bool RetState = false;    try    {        var len = SourceFileDir.Length;        var strlen = SourceFileDir[len - 1];        if (SourceFileDir[SourceFileDir.Length - 1] != Path.DirectorySeparatorChar)        {            SourceFileDir += Path.DirectorySeparatorChar;        }        ZipOutputStream outstream = new ZipOutputStream(File.Create(SaveZipFilePath));        outstream.SetLevel(6);
        if (IsShowDialog)        {            //压缩进度提示框            frm_CreateZipFile frm = new frm_CreateZipFile(SourceFileDir, outstream, SaveZipFilePath);            frm.ShowDialog();        }        else        {            zip(SourceFileDir, outstream, SourceFileDir);        }
        outstream.Finish();        outstream.Close();        RetState = true;    }    catch (Exception)    {        RetState = false;    }    return RetState;}
//递归创建ZIP调用函数private bool zip(string strFile, ZipOutputStream outstream, string staticFile){    bool RetState = false;    try    {        if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)        {            strFile += Path.DirectorySeparatorChar;        }        Crc32 crc = new Crc32();        //获取指定目录下所有文件和子目录文件名称        string[] filenames = Directory.GetFileSystemEntries(strFile);        //遍历文件        foreach (string file in filenames)        {            if (Directory.Exists(file))            {                zip(file, outstream, staticFile);            }            //否则,直接压缩文件            else            {                //打开文件                FileStream fs = File.OpenRead(file);                //定义缓存区对象                byte[] buffer = new byte[fs.Length];                //通过字符流,读取文件                fs.Read(buffer, 0, buffer.Length);                //得到目录下的文件(比如:D:\Debug1\test),test                string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1);                ZipEntry entry = new ZipEntry(tempfile);                entry.DateTime = DateTime.Now;                entry.Size = fs.Length;                fs.Close();                crc.Reset();                crc.Update(buffer);                entry.Crc = crc.Value;                outstream.PutNextEntry(entry);                //写文件                outstream.Write(buffer, 0, buffer.Length);            }        }        RetState = true;    }    catch (Exception)    {        RetState = false;    }    return RetState;}
//(2)解压调用方法UnZipFile(SaveZipFilePath, SaveFileDir);/// <summary>/// 解压单层、多层目录文件///注:只解压内容,不会创建最外层文件夹;/// </summary>/// <param name="ZipFilePath">ZIP文件完整路径</param>/// <param name="SaveFileDir">解压后保存目录</param>/// <returns></returns>public bool UnZipFile(string ZipFilePath, string SaveFileDir){    bool RetState = false;    try    {        if (!File.Exists(ZipFilePath)) return false;        //读取压缩文件(zip文件),准备解压缩        ZipInputStream inputstream = new ZipInputStream(File.OpenRead(ZipFilePath.Trim()));        ZipEntry entry;        string path = SaveFileDir;        //解压出来的文件保存路径        string rootDir = "";        //根目录下的第一个子文件夹的名称        while ((entry = inputstream.GetNextEntry()) != null)        {            rootDir = Path.GetDirectoryName(entry.Name);            //得到根目录下的第一级子文件夹的名称            if (rootDir.IndexOf("\\") >= 0)            {                rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);            }            string dir = Path.GetDirectoryName(entry.Name);            //得到根目录下的第一级子文件夹下的子文件夹名称            string fileName = Path.GetFileName(entry.Name);            //根目录下的文件名称            if (dir != "")            {                //创建根目录下的子文件夹,不限制级别                if (!Directory.Exists(SaveFileDir + "\\" + dir))                {                    path = SaveFileDir + "\\" + dir;                    //在指定的路径创建文件夹                    Directory.CreateDirectory(path);                }            }            else if (dir == "" && fileName != "")            {                //根目录下的文件                path = SaveFileDir;            }            else if (dir != "" && fileName != "")            {                //根目录下的第一级子文件夹下的文件                if (dir.IndexOf("\\") > 0)                {                    //指定文件保存路径                    path = SaveFileDir + "\\" + dir;                }            }            if (dir == rootDir)            {                //判断是不是需要保存在根目录下的文件                path = SaveFileDir + "\\" + rootDir;            }
            //以下为解压zip文件的基本步骤            //基本思路:遍历压缩文件里的所有文件,创建一个相同的文件            if (fileName != String.Empty)            {                FileStream fs = File.Create(path + "\\" + fileName);                int size = 2048;                byte[] data = new byte[2048];                while (true)                {                    size = inputstream.Read(data, 0, data.Length);                    if (size > 0)                    {                        fs.Write(data, 0, size);                    }                    else                    {                        break;                    }                }                fs.Close();            }        }        inputstream.Close();        RetState = true;    }    catch (Exception)    {        RetState = false;    }    return RetState;}


阅读原文:原文链接


该文章在 2025/7/21 15:18:21 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved