C#压缩或解压rar、zip文件方法实例

 更新时间:2021年5月10日 15:00  点击:2268

前言

为了便于文件在网络中的传输和保存,通常将文件进行压缩操作,常用的压缩格式有rar、zip和7z,本文将介绍在C#中如何对这几种类型的文件进行压缩和解压,并提供一些在C#中解压缩文件的开源库。

在C#.NET中压缩解压rar文件

rar格式是一种具有专利文件的压缩格式,是一种商业压缩格式,不开源,对解码算法是公开的,但压缩算法是私有的,需要付费,如果需要在您的商业软件中使用rar格式进行解压缩,那么你需要为rar付费,rar在国内很流行是由于盗版的存在,正因为算法是不开源的,所以我们压缩rar并没有第三方的开源库可供选择,只能另寻出路。

针对rar的解压缩,我们通常使用winrar,几乎每台机器都安装了winrar,对于普通用户来说它提供基于用户界面的解压缩方式,另外,它也提供基于命令行的解压缩方式,这为我们在程序中解压缩rar格式提供了一个入口,我们可以在C#程序中调用rar的命令行程序实现解压缩,思路是这样的:

1、判断注册表确认用户机器是否安装winrar程序,如果安装取回winrar安装目录。

2、创建一个命令行执行进程。

3、通过winrar的命令行参数实现解压缩。

首先我们通过下面的代码判断用户计算机是否安装了winrar压缩工具:

如果已经安装winrar可通过如下代码返回winrar的安装位置,未安装则返回空字符串,最后并关闭注册表:

public static string ExistsWinRar()
{
    string result = string.Empty;

    string key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";
    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(key);
    if (registryKey != null)
    {
        result = registryKey.GetValue("").ToString();
    }
    registryKey.Close();

    return result;
}

/// <summary>
/// 将格式为rar的压缩文件解压到指定的目录
/// </summary>
/// <param name="rarFileName">要解压rar文件的路径</param>
/// <param name="saveDir">解压后要保存到的目录</param>
public static void DeCompressRar(string rarFileName, string saveDir)
{
    string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";
    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(regKey);
    string winrarPath = registryKey.GetValue("").ToString();
    registryKey.Close();
    string winrarDir = System.IO.Path.GetDirectoryName(winrarPath);
    String commandOptions = string.Format("x {0} {1} -y", rarFileName, saveDir);

    ProcessStartInfo processStartInfo = new ProcessStartInfo();
    processStartInfo.FileName = System.IO.Path.Combine(winrarDir, "rar.exe");
    processStartInfo.Arguments = commandOptions;
    processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    Process process = new Process();
    process.StartInfo = processStartInfo;
    process.Start();
    process.WaitForExit();
    process.Close();
}

/// <summary>
/// 将目录和文件压缩为rar格式并保存到指定的目录
/// </summary>
/// <param name="soruceDir">要压缩的文件夹目录</param>
/// <param name="rarFileName">压缩后的rar保存路径</param>
public static void CompressRar(string soruceDir, string rarFileName)
{
    string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";
    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(regKey);
    string winrarPath = registryKey.GetValue("").ToString();
    registryKey.Close();
    string winrarDir = System.IO.Path.GetDirectoryName(winrarPath);
    String commandOptions = string.Format("a {0} {1} -r", rarFileName, soruceDir);

    ProcessStartInfo processStartInfo = new ProcessStartInfo();
    processStartInfo.FileName = System.IO.Path.Combine(winrarDir, "rar.exe");
    processStartInfo.Arguments = commandOptions;
    processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    Process process = new Process();
    process.StartInfo = processStartInfo;
    process.Start();
    process.WaitForExit();
    process.Close();
}

在C#.NET中压缩解压zip文件

zip是一种免费开源的压缩格式,windows平台自带zip压缩和解压工具,由于算法是开源的,所以基于zip的解压缩开源库也很多,SharpZipLib是一个很不错的C#库,它能够解压缩zip、gzip和tar格式的文件,首先下载SharpZipLib解压后,在您的项目中引用ICSharpCode.SharpZLib.dll程序集即可,下面是一些关于SharpZipLib压缩和解压的示例。

ZipOutputStream zipOutStream = new ZipOutputStream(File.Create("my.zip"));
CreateFileZipEntry(zipOutStream, "file1.txt", "file1.txt");
CreateFileZipEntry(zipOutStream, @"folder1\folder2\folder3\file2.txt", "file2.txt");
zipOutStream.Close();

Directory.CreateDirectory("ZipOutPut");
 ZipInputStream zipInputStream = new ZipInputStream(File.Open("my.zip", FileMode.Open));
 ZipEntry zipEntryFromZippedFile = zipInputStream.GetNextEntry();
 while (zipEntryFromZippedFile != null)
 {
     if (zipEntryFromZippedFile.IsFile)
     {
         FileInfo fInfo = new FileInfo(string.Format("ZipOutPut\\{0}", zipEntryFromZippedFile.Name));
         if (!fInfo.Directory.Exists) fInfo.Directory.Create();

         FileStream file = fInfo.Create();
         byte[] bufferFromZip = new byte[zipInputStream.Length];
         zipInputStream.Read(bufferFromZip, 0, bufferFromZip.Length);
         file.Write(bufferFromZip, 0, bufferFromZip.Length);
         file.Close();
     }
     zipEntryFromZippedFile = zipInputStream.GetNextEntry();
 }
 zipInputStream.Close();

使用.NET中自带的类解压缩zip文件

微软在System.IO.Compression命名空间有一些关于文件解压缩的类,如果只是希望压缩解压zip和gzip格式的文件,是个不错的选择,在NET Framework 4.5框架中,原生System.IO.Compression.FileSystem.dll程序集中新增了一个名为ZipFile的类,,让压缩和解压zip文件变得更简单,ZipFile的使用示例如下:

System.IO.Compression.ZipFile.CreateFromDirectory(@"e:\test", @"e:\test\test.zip"); //压缩

System.IO.Compression.ZipFile.ExtractToDirectory(@"e:\test\test.zip", @"e:\test"); //解压

支持格式最多的C#解压缩开源库

当您还苦苦在为上面的各种压缩格式发愁的时候,一个名为SharpCompress的C#框架被开源,您可以在搜索引擎中找到SharpCompress框架的开源代码,它支持:rar 7zip, zip, tar, tzip和bzip2格式的压缩和解压,下面的示例直接从rar格式文件读取并解压文件。

using (Stream stream = File.OpenRead(@"C:\Code\sharpcompress.rar"))
{
    var reader = ReaderFactory.Open(stream);
    while (reader.MoveToNextEntry())
    {
        if (!reader.Entry.IsDirectory)
        {
            Console.WriteLine(reader.Entry.FilePath);
            reader.WriteEntryToDirectory(@"C:\temp");
        }
    }
}

总结

关于rar和zip格式相比,rar的压缩率比zip要高,而且支持分卷压缩,但rar是商业软件,需要付费,zip压缩率不如rar那么高,但开源免费,7zip格式开源免费,压缩率较为满意,这些压缩格式各有优势,就微软平台和一些开源平台来说,一般采用的都是zip格式,因为它更容易通过编程的方式实现,比rar更加可靠。

/// <summary>
/// 解压RAR和ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe))
/// </summary>
/// <param name="UnPath">解压后文件保存目录</param>
/// <param name="rarPathName">待解压文件存放绝对路径(包括文件名称)</param>
/// <param name="IsCover">所解压的文件是否会覆盖已存在的文件(如果不覆盖,所解压出的文件和已存在的相同名称文件不会共同存在,只保留原已存在文件)</param>
/// <param name="PassWord">解压密码(如果不需要密码则为空)</param>
/// <returns>true(解压成功);false(解压失败)</returns>
public static bool UnRarOrZip( string UnPath, string rarPathName, bool IsCover, string PassWord)
{
     if (!Directory.Exists(UnPath))
         Directory.CreateDirectory(UnPath);
     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, rarPathName, UnPath);
     else if (! string .IsNullOrEmpty(PassWord) && !IsCover)
         //解压加密文件且不覆盖已存在文件( -p密码 )
         cmd = string .Format( " x -p{0} -o- {1} {2} -y" , PassWord, rarPathName, UnPath);
     else if (IsCover)
         //覆盖命令( x -o+ 代表覆盖已存在的文件)
         cmd = string .Format( " x -o+ {0} {1} -y" , rarPathName,UnPath);
     else
         //不覆盖命令( x -o- 代表不覆盖已存在的文件)
         cmd = string .Format( " x -o- {0} {1} -y" , rarPathName, UnPath);
     //命令
     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 ;
     }
 
}
 
/// <summary>
/// 压缩文件成RAR或ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe))
/// </summary>
/// <param name="filesPath">将要压缩的文件夹或文件的绝对路径</param>
/// <param name="rarPathName">压缩后的压缩文件保存绝对路径(包括文件名称)</param>
/// <param name="IsCover">所压缩文件是否会覆盖已有的压缩文件(如果不覆盖,所压缩文件和已存在的相同名称的压缩文件不会共同存在,只保留原已存在压缩文件)</param>
/// <param name="PassWord">压缩密码(如果不需要密码则为空)</param>
/// <returns>true(压缩成功);false(压缩失败)</returns>
public static bool CondenseRarOrZip( string filesPath, string rarPathName, bool IsCover, string PassWord)
{
     string rarPath = Path.GetDirectoryName(rarPathName);
     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, rarPathName, filesPath);
     else if (! string .IsNullOrEmpty(PassWord) && !IsCover)
         //压缩加密文件且不覆盖已存在压缩文件( -p密码 -o-不覆盖 )
         cmd = string .Format( " a -ep1 -p{0} -o- {1} {2} -r" , PassWord, rarPathName, filesPath);
     else if ( string .IsNullOrEmpty(PassWord) && IsCover)
         //压缩且覆盖已存在压缩文件( -o+覆盖 )
         cmd = string .Format( " a -ep1 -o+ {0} {1} -r" , rarPathName, filesPath);
     else
         //压缩且不覆盖已存在压缩文件( -o-不覆盖 )
         cmd = string .Format( " a -ep1 -o- {0} {1} -r" , rarPathName, filesPath);
     //命令
     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 ;
     }
 
}

到此这篇关于C#压缩或解压rar、zip文件的文章就介绍到这了,更多相关C#压缩解压rar、zip内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25