C#实现压缩与解压缩方案

C#实现压缩与解压的方案有很多,比如以下几种:

1. Ionic.Zip (第三方 太老不支持内存压缩)(网上有使用例子:https://www.cnblogs.com/chenghu/p/4607866.html

2. SharpZipLibDotNetZip (第三方,一款比较经典实用C#压缩类库)

3. ZipArchive 和 ZipFile(.NET 4.5 System.IO.Compression命名空间中新提供的压缩类)(以下是该方案的实现例子)

 

一、ZipArchive 和 ZipFile例子

在 4.5 之前,处理压缩文件,我们经常需要使用第三方的类库 SharpZipLib, 现在可以直接实现了。

1.准备工作

首先做一下准备工作,需要确保你使用 .NET 4.5 版,可以在项目的属性窗口中检查一下。

然后,引用必须的程序集。

程序集有两个:System.IO.Compression 和 System.IO.Compression.FileSystem.

类似于对文件和目录的操作,对于压缩文件也提供了两种方式:ZipArchive 和 ZipFile,分别对应两个新增加的类 ZipArchive 和 ZipFile。这两个类都定义在命名空间 System.IO.Compression 中。

为了后面演示方便,我们定义一个表示压缩文件路径的常量。

const string zipFilePath = @"..\..\Sample.zip";

2. 使用 ZipArchive

先看ZipArchive的使用。

2.1 创建压缩文件

创建一个空的压缩文件,使用 ZipArchiveMode.Create 创建参数。

// 创建 Zip 文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{

}

使用 WinRaR 打开压缩文件,可以看到里面没有文件。

2.2 创建并添加文件

通常,在创建的同时,我们就会加入一些文件,下面的例子中,我们将当前的执行程序文件本身加到压缩文件中。

 

// 创建并添加被压缩文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{
    System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
    string path = assemble.Location;
    string filename = System.IO.Path.GetFileName(path);

    ZipArchiveEntry readMeEntry = archive.CreateEntry(filename);
    using (System.IO.Stream stream = readMeEntry.Open())
    {
        byte[] bytes = System.IO.File.ReadAllBytes(path);
        stream.Write(bytes, 0, bytes.Length);
    }
}

现在,打开压缩文件,可以看到文件已经被压缩进来了。

2.3 列出压缩文件内容

当然,也可以通过程序检查压缩文件的内容了。使用 Read 方式就可以了。

 

// 列出压缩压缩文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{

    foreach (var zipArchiveEntry in archive.Entries)
        Console.WriteLine(
            "FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName
        );
}

 

2.4 提取压缩文件

当然可以从压缩文件中提取被压缩的内容了。

 

// 读取其中一个文件的内容
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{
    // 解压某个文件
    ZipArchiveEntry entry = archive.GetEntry("ZipArchiveSample.exe");
    Console.WriteLine(entry.Name);
    using (System.IO.Stream stream = entry.Open())
    {
        System.IO.Stream output = new FileStream("http://www.cnblogs.com/ZipArchiveSample.exe", FileMode.Create);
        int b = -1;
        while ((b = stream.ReadByte()) != -1)
        {
            output.WriteByte((byte) b);
        }
        output.Close();
    }

}

 

2.5 更新压缩文件

在压缩文件已经创建之后,还可以打开它,继续添加文件,这就称为更新了,使用 Update 模式。

 

// 向现有的压缩文件中添加文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
{
    // 这里添加当前正在执行的程序文件本身
    System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
    string path = assemble.Location;
    string filename = System.IO.Path.GetFileName( path);

    ZipArchiveEntry readMeEntry = archive.CreateEntry( filename );
    using (System.IO.Stream stream = readMeEntry.Open() )
    {
        byte[] bytes = System.IO.File.ReadAllBytes(path);
        stream.Write(bytes, 0, bytes.Length);
    }

    foreach (var zipArchiveEntry in archive.Entries)
        Console.WriteLine(
            "FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName
        );
}

 

现在压缩文件中又增加了一个,这可以一个怪异的文件,同一个文件被在压缩文件中添加了两次!

3. 使用 ZipFile

除了上边的基本方法之外,还有一些简单的使用方法。这涉及到另外一个类:ZipFile。

3.1 创建空压缩文件

 

// 删除压缩文件
System.IO.File.Delete(zipFilePath);

// 使用 ZipFile 的静态方法创建压缩文件,要保证文件没有存在
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
}

 

3.2 创建并添加文件

直接添加一个文件的方法。直接使用 CreateEntryFromFile 就可以了。

 

System.IO.File.Delete(zipFilePath);

// 使用 CreateEntryFromFile 方法添加文件
// 使用 ZipFile 的静态方法创建压缩文件
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
    System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
    string path = assemble.Location;
    string filename = System.IO.Path.GetFileName(path);

    zipArchive.CreateEntryFromFile(path, filename);
}

 

3.3 解压文件

将压缩文件解压到指定的目录中。

// 解压文件
ZipFile.ExtractToDirectory(zipFilePath, "../..");

3.4 压缩一个目录

还可以直接将一个目录中所有的文件都压缩到一个压缩文件中。

// 压缩指定目录中所有文件
System.IO.File.Delete(zipFilePath);
ZipFile.CreateFromDirectory(".", zipFilePath);

你是不是最喜欢这个方法?现在压缩文件中的文件更多了。

 

 

二、MVC中利用SharpZipLib实现文件流直接打包成压缩包:

https://www.cnblogs.com/hgmyz/p/12351598.html

using ICSharpCode.SharpZipLib.Checksums; 
using ICSharpCode.SharpZipLib.Zip; 
using System.IO;
//控制器写法
public FileResult PrintData()
{
    byte[] bytePDF = 需要打包的文件流;
    byte[] result = null;
    using (MemoryStream ms = new MemoryStream())
    {
        using (ZipOutputStream zipStream = new ZipOutputStream(ms))
        {
            zipStream.Password = "123456";//设置压缩包密码
            ZipEntry entry = new ZipEntry("文件名");
            entry.DateTime = DateTime.Now;//创建时间
            zipStream.PutNextEntry(entry);
            zipStream.Write(bytePDF, 0, bytePDF.Length);
            zipStream.CloseEntry();
            zipStream.IsStreamOwner = false;
            zipStream.Finish();
            zipStream.Close();
            ms.Position = 0;
            //压缩后的数据被保存到了byte[]数组中。
            result = ms.ToArray();
        }
    }
    return File(result, "application/zip", "文件名.zip");
}

Asp.Net(Web From) 输出ZIP文件 

//https://www.cnblogs.com/sntetwt/p/11094789.html
Response.ContentType = "application/zip";
using (var fs = System.IO.File.OpenRead(file))
{
    var b = new byte[1024];
    int n;
    while ((n = fs.Read(b, 0, b.Length)) > 0)
    {
        Response.OutputStream.Write(b, 0, n);
    }
}
Response.Close();

 

附录:

SharpZipLib 的下载地址: http://www.icsharpcode.net/OpenSource/SharpZipLib/

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值