C#压缩和解压文件的两种方法

 更新时间:2024年08月14日 09:45:16   作者:△曉風殘月〆  
在C#中,我们可以使用内置的System.IO命名空间下的几个类来处理文件的压缩和解压缩,主要涉及到两个常用的库:System.IO.Compression和WinRAR,以下是使用这些类进行文件压缩和解压缩的基本步骤,需要的朋友可以参考下

这里用两种方法实现C#压缩和解压文件

1、使用System.IO.Compression名称空间下的相关类(需引用 System.IO.Compression.FileSystem和System.IO.Compression程序集)

 创建zip压缩文件

使用ZipFile类CreateFromDirectory()方法来创建zip压缩文件。它有3种重载形式,这里说一下常用的两个

public static void CreateFromDirectory(
    string sourceDirectoryName,
    string destinationArchiveFileName
 )

public static void CreateFromDirectory(
     string sourceDirectoryName,//sourceDirectoryName 要压缩的文件夹
     string destinationArchiveFileName, //destinationArchiveFileName 压缩后的文件名
     CompressionLevel compressionLevel,//compressionLevel 压缩级别  Fastest-最快 NoCompression-不压缩 Optimal-最好
     bool includeBaseDirectory //includeBaseDirectory 是否包含当前目录
 )

测试代码如下:

static void Main(string[] args)
         {
             ZipFile.CreateFromDirectory("D:\\test", "D:\\a.zip");
          }

在D盘创建一个test目录,里面放一张图片,

运行

结果如下:

static void Main(string[] args)
         {           
             ZipFile.CreateFromDirectory("D:\\test", "D:\\b.zip",CompressionLevel.Optimal,true);
         }

运行结果如下

解压zip压缩文件

使用 ZipFile类的ExtractToDirectory()方法

public static void ExtractToDirectory(
    string sourceArchiveFileName,  //压缩文件完整路径
     string destinationDirectoryName //指定解压文件夹
 )
static void Main(string[] args)
         {          
             ZipFile.ExtractToDirectory("D:\\a.zip", "D:\\");
        }

运行结果如下

这里需要注意的是,如果文件已存在,会引发一个IOException

添加文件到现有zip压缩文件

 using (FileStream fs = new FileStream("D:\\a.zip", FileMode.Open))
             {
                 using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
                 {
                     archive.CreateEntryFromFile("C:\\Users\\ZhaoJia\\Pictures\\1.jpg","1.jpg");                                      
                 }
             }

运行结果如下

创建gz压缩文件

使用GZipStream类来创建gz压缩文件

   static void Main(string[] args)
          {
              string filePath = "D:\\test";    //要添加到压缩文件的目录
              string targetPath = "D:\\";      //压缩文件存放的目录         
  
              DirectoryInfo dirInfo = new DirectoryInfo(filePath);
  
              foreach (FileInfo fileInfo in dirInfo.GetFiles())
              {
                 using (FileStream fsorg = fileInfo.OpenRead())
                 {
                     using (FileStream fs = File.Create(targetPath + fileInfo.Name + ".gz"))
                     {
                         using (GZipStream compressionStream = new GZipStream(fs,
                             CompressionMode.Compress))
                         {
                             fsorg.CopyTo(compressionStream);
                         }
                     }
                 }
             }
         }

使用这个类来创建gz文件有几个缺陷

1、压缩文件里只能有一个文件

2、压缩后的文件名要带上压缩文件里文件的后缀名。如有一个图像文件为a.jpg,生成的gz压缩文件名为  a.jpg.gz

解压gz压缩文件

    string compressFilePath = "D:\\4172212144245982608.jpg.gz";//压缩文件名
  
              FileInfo fileInfo = new FileInfo(compressFilePath);
  
              using (FileStream originalFileStream = fileInfo.OpenRead())
              {
                  string currentFileName = fileInfo.FullName;
                  string newFileName = currentFileName.Remove(currentFileName.Length - fileInfo.Extension.Length);
  
                 using (FileStream decompressedFileStream = File.Create(newFileName))
                 {
                     using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                     {
                         decompressionStream.CopyTo(decompressedFileStream);                   
                     }
                 }
             }

2、使用WinRAR

WinRAR提供了一个控制台版本的exe,我们可以调用这个exe来压缩和解压文件

WinRAR支持的格式比较多,包括RAR、7Z、ACE、ARJ、BZ2、CAB、GZ、ISO、JAR、LZH、TAR、UUE、XZ、Z、001

这个exe不依赖其它的库,这里我们直接拷到项目的运行目录下

Rar.exe支持的命令参数非常多,这里不全部介绍。有兴趣的可以运行Rar -?查看详细的命令说明

创建rar压缩文件

语法如下:Rar.exe a "D:\test.rar" "D:\test"

  static void Main(string[] args)
          {
              const string RARToolName = "Rar.exe";        //Rar命令行exe
              string compressionFileName = "D:\\test.rar"; //压缩后的文件名
              string sourceFolderName = "D:\\test";        //要压缩的文件夹
  
              Process p = new Process();
              ProcessStartInfo startInfo = new ProcessStartInfo();
              startInfo.FileName = RARToolName;
             startInfo.CreateNoWindow = false;
             startInfo.UseShellExecute = false;
             startInfo.Arguments = string.Format("{0} {1} {2}","a",compressionFileName,sourceFolderName);
             p.StartInfo = startInfo;
             p.Start();
         }

运行结果如下

打开D盘,会看到test.rar

解压Rar压缩文件

语法如下:Rar.exe x "D:\test.rar" "D:\test"

 const string RARToolName = "Rar.exe";        //Rar命令行exe
             string compressionFileName = "D:\\test.rar"; //指定压缩文件名
             string sourceFolderName = "D:\\test";   //要解压到的文件夹
             Process p = new Process();
             ProcessStartInfo startInfo = new ProcessStartInfo();
             startInfo.FileName = RARToolName;
             startInfo.CreateNoWindow = false;
             startInfo.UseShellExecute = false;
             startInfo.Arguments = string.Format("{0} {1} {2}","x",compressionFileName,sourceFolderName);
             p.StartInfo = startInfo;
             p.Start();

这里还有一个操作,就是可以把图片和RAR压缩文件合并成一个文件

首先准备一个RAR文件,一个图片文件

   static void Main(string[] args)
         {
             string imageFilePath = "D:\\2.jpg";            //图片文件路径
             string rarFilePath = "D:\\test.rar";           //压缩文件路径
             string command = string.Format("copy /b {0} + {1} = {0}",imageFilePath,rarFilePath);  //命令
 
             Process p = new Process();
             ProcessStartInfo startInfo = new ProcessStartInfo();
             startInfo.FileName = "cmd.exe";
             startInfo.UseShellExecute = false;    
             startInfo.CreateNoWindow = false;
             startInfo.RedirectStandardInput = true;
             startInfo.RedirectStandardOutput = true;
             p.StartInfo = startInfo;          
             p.Start();
             p.StandardInput.WriteLine(command + "&exit");
             p.StandardInput.AutoFlush = true;      
             p.WaitForExit();
             p.Close();
             Console.WriteLine("执行成功");
 }

执行完成后,会发现图片文件变大了

此时我们只要将文件后缀修改为.rar,就可以以压缩文件的方式打开该文件。修改为.jpg,可以正常打开图片。

以上就是C#压缩和解压文件的两种方法的详细内容,更多关于C#压缩和解压文件的资料请关注脚本之家其它相关文章!

相关文章

  • C#如何优雅地取消进程的执行之Cancellation详解

    C#如何优雅地取消进程的执行之Cancellation详解

    本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件
    2024-12-12
  • C#实现将TextBox绑定为KindEditor富文本

    C#实现将TextBox绑定为KindEditor富文本

    KindEditor 依靠出色的用户体验和领先的技术提供富文本编辑功能,是一款非常受欢迎的HTML在线编辑器,下面我们就来看看C#如何将TextBox绑定为KindEditor富文本吧
    2024-04-04
  • C# memcached缓存使用实例代码

    C# memcached缓存使用实例代码

    这篇文章主要介绍了C# memcached缓存使用实例,大家参考使用
    2013-12-12
  • C#中的XML与JSON数据处理的案例详解

    C#中的XML与JSON数据处理的案例详解

    在现代软件开发中,数据交换和存储的需求日益增长,而 XML 和 JSON 成为了两种最常用的数据格式,它们各有特点,在不同的场景下有着各自的优势,本文将从 C# 的角度出发,探讨如何处理这两种数据格式,并分享一些常见的问题及解决方法,需要的朋友可以参考下
    2024-09-09
  • C# 操作 access 数据库的实例代码

    C# 操作 access 数据库的实例代码

    这篇文章主要介绍了C# 操作 access 数据库的实例代码,需要的朋友可以参考下
    2018-03-03
  • C# SQLite执行效率的优化教程

    C# SQLite执行效率的优化教程

    这篇文章主要给大家介绍了关于C# SQLite执行效率优化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C# SQLite具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • C#多线程经典示例(吃苹果)

    C#多线程经典示例(吃苹果)

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解。下面跟着小编一起来看下吧
    2017-01-01
  • 浅析c# 接口

    浅析c# 接口

    这篇文章主要介绍了c# 接口的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下。
    2020-07-07
  • C#实现将PPT转换成HTML的方法

    C#实现将PPT转换成HTML的方法

    这篇文章主要介绍了C#实现将PPT转换成HTML的方法,非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • C# 单例模式的多种实现方式

    C# 单例模式的多种实现方式

    单例模式是一种确保类只有一个实例的设计模式,主要用于提供全局访问点,C#中实现单例的方法多样,包括饿汉式和懒汉式,各有优缺点,此外,单例模式不仅提高代码可重用性和可读性,还增强了系统的可维护性
    2024-11-11

最新评论