C#实现文件或文件夹压缩和解压

Posted DotNet资源分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#实现文件或文件夹压缩和解压相关的知识,希望对你有一定的参考价值。

C#文件或文件夹压缩和解压方法有很多,本文通过使用ICSharpCode.SharpZipLib.dll来进行压缩解压

1、新建一个winform项目,选择项目右键 管理NuGet程序包,搜索ICSharpCode.SharpZipLib,进行安装,

如下所示

 

 

2、项目winform窗体添加测试按钮 压缩和解压

 

 

 3、具体代码如下

using ICSharpCode.SharpZipLib.Checksums;using ICSharpCode.SharpZipLib.Zip;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Text;using System.Windows.Forms;
namespace WindowsFormsApp2._0{ public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void Button12_Click(object sender, EventArgs e) { ZipFile(@"F:\Person\Longteng\LongtengSln\WindowsFormsApp2.0\bin\Debug\devicelog", @"F:\Person\Longteng\LongtengSln\WindowsFormsApp2.0\bin\Debug\devicelog.zip"); MessageBox.Show("压缩 成功"); }
private void Button13_Click(object sender, EventArgs e) { UnZipFile(@"F:\Person\Longteng\LongtengSln\WindowsFormsApp2.0\bin\Debug\devicelog.zip", @"F:\Person\Longteng\LongtengSln\WindowsFormsApp2.0\bin\Debug\devicelog11"); MessageBox.Show("解压 成功"); }
public void ZipFile(string strFile, string strZip) { if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) { strFile += Path.DirectorySeparatorChar; } ZipOutputStream outstream = new ZipOutputStream(File.Create(strZip)); outstream.SetLevel(6); ZipCompress(strFile, outstream, strFile); outstream.Finish(); outstream.Close(); }
public void ZipCompress(string strFile, ZipOutputStream outstream, string staticFile) { 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)) { ZipCompress(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); } } }
public string UnZipFile(string TargetFile, string fileDir) { string rootFile = ""; try { if (!Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } //读取压缩文件(zip文件),准备解压缩 ZipInputStream inputstream = new ZipInputStream(File.OpenRead(TargetFile.Trim())); ZipEntry entry; string path = fileDir; //解压出来的文件保存路径 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(fileDir + "\\" + dir)) { path = fileDir + "\\" + dir; //在指定的路径创建文件夹 Directory.CreateDirectory(path); } } else if (dir == "" && fileName != "") { //根目录下的文件 path = fileDir; rootFile = fileName; } else if (dir != "" && fileName != "") { //根目录下的第一级子文件夹下的文件 if (dir.IndexOf("\\") > 0) { //指定文件保存路径 path = fileDir + "\\" + dir; } } if (dir == rootDir) { //判断是不是需要保存在根目录下的文件 path = fileDir + "\\" + 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(); return rootFile; } catch (Exception ex) { return ex.Message; } }
/// <summary> /// 批量压缩事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnBatchZipFlo_Click(object sender, EventArgs e) { string path1 = "D:\\123\\"; //待压缩的目录文件 string path2 = "D:\\456\\"; //压缩后存放目录文件 //获取指定目录下所有文件和子文件名称(所有待压缩的文件) string[] files = Directory.GetFileSystemEntries(path1); //ZipFloClass zc = new ZipFloClass(); //遍历指定目录下文件路径 foreach (string file in files) { //截取文件路径的文件名 var filename = file.Substring(file.LastIndexOf("\\") + 1); //调用压缩方法(参数1:待压缩的文件目录,参数2:压缩后的文件目录(包含后缀)) ZipFile(path1 + filename, path2 + filename + ".zip"); } }
/// <summary> /// 批量解压事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnBatchUnZipFlo_Click(object sender, EventArgs e) { string msg = ""; string path2 = "D:\\123\\"; string path3 = "D:\\456\\"; //获取指定目录下所有文件和子文件名称(所有待解压的压缩文件) string[] files = Directory.GetFileSystemEntries(path2); //UnZipFloClass uzc = new UnZipFloClass(); //遍历所有压缩文件路径 foreach (string file in files) { //获取压缩包名称(包括后缀名) var filename = file.Substring(file.LastIndexOf("\\") + 1); //得到压缩包名称(没有后缀) filename = filename.Substring(0, filename.LastIndexOf(".")); //判断解压的路径是否存在 if (!Directory.Exists(path3 + filename)) { //没有,则创建这个路径 Directory.CreateDirectory(path3 + filename); } //调用解压方法(参数1:待解压的压缩文件路径(带后缀名),参数2:解压后存放的文件路径,参数3:返工是否解压成功) UnZipFile(file, path3 + filename); } MessageBox.Show("批量解压成功"); } }}



其它压缩工具的使用方式:


7-Zip 简介

7-Zip 是一款号称有着现今最高压缩比的压缩软件,它不仅支持独有的 7z 文件格式,而且还支持各种其它压缩文件格式,其中包括 ZIP, RAR, CAB, GZIP, BZIP2和 TAR 等等。此软件压缩的压缩比要比普通 ZIP 文件高 30-50% ,因此,它可以把 Zip 格式的文件再压缩 2-10% 。
7-Zip 主要特征
更新了算法来加大 7z 格式 的压缩比
支持格式:
压缩及解压缩:7z、ZIP、GZIP、BZIP2 和 TAR
仅解压缩:RAR、CAB、ISO、ARJ、LZH、CHM、WIM、Z、CPIO、RPM、DEB 和 NSIS
对于 ZIP 及 GZIP 格式,7-Zip 能提供比使用 PKZip 及 WinZip 高 2-10% 的压缩比
7z 格式支持创建自释放(SFX)压缩档案
集成 Windows 外壳扩展
强大的的文件管理
强大的命令行版本
支持 FAR Manager 插件
支持 69 种语言

 

C#中压缩/解压缩7-zip文件的方法

 

 1.控制台方式调用7z.exe文件

 

public static void Unzip(DirectoryInfo DirecInfo)
{
   if (DirectInfo.Exists)
   {
       foreach (FileInfo fileInfo in DirecInfo.GetFiles("*.zip"))
       {
           Process process = new Process();
           process.StartInfo.FileName = @"C:\Program Files\7-zip\7z.exe";
           process.StartInfo.Arguments = @" e C:\Directory\" + fileInfo.Name + @" -o C:\Directory";
           process.Start();
       }
   }
}

 


2.根据压缩算法LZMA SDK

LZMA SDK里面包括了压缩和解压缩算法的C#源码(当前版本是4.65)
下载地址: http://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/4.65/lzma465.tar.bz2/download
 
3.在.NET应用程序中使用7-Zip的压缩/解压缩功能(作者 Abel Avram 译者 赵劼 )
开发人员Eugene Sichkar创建了一系列7-Zip动态链接库的C#接口,.NET应用程序中使用7-Zip的压缩/解压缩功能了。
据Eugene称,该项目实现了以下接口:
 
   
   
 
  • IProgress - 基本进度的回调

  • IArchiveOpenCallback - 打开压缩包的回调

  • ICryptoGetTextPassword - 为压缩提示密码的回调

  • IArchiveExtractCallback - 对压缩包进行解压的回调

  • IArchiveOpenVolumeCallback - 打开额外压缩卷的回调

  • ISequentialInStream - 基本的只读数据流接口

  • ISequentialOutStream - 基本的只写数据流的接口

  • IInStream - 可以随机读取的输入数据流接口

  • IOutStream - 输出数据流接口

  • IInArchive - 主要压缩接口

具体的使用方式可以参考源码中示例.
4.SevenZipSharp 

markhor 创建了SevenZipSharp 项目,SevenZipSharp 是开源的,里面实现了自解压和压缩所有7-ZIP支持的格式.它改进了7-Zip动态链接库的C#接口的一些方法.

常用压缩/解压缩示例(引自SevenZipSharp示例文件):

解压缩文件

using (SevenZipExtractor tmp = new SevenZipExtractor(@"d:\Temp\7z465_extra.7z"))
{
     for (int i = 0; i < tmp.ArchiveFileData.Count; i++)
     {
        tmp.ExtractFiles(@"d:\temp\!Пусто\", tmp.ArchiveFileData[i].Index);
     }
     //tmp.ExtractFiles(@"d:\temp\!Пусто\", 1, 3, 5);
}

分卷压缩

SevenZipExtractor.SetLibraryPath(@"d:\Work\Misc\7zip\9.04\CPP\7zip\Bundles\Format7zF\7z.dll");
using (SevenZipExtractor tmp = new SevenZipExtractor(@"d:\Temp\SevenZip.7z.001"))
{
    tmp.ExtractArchive(@"d:\Temp\!Пусто");
}

 

 压缩文件

SevenZipCompressor tmp = new SevenZipCompressor();
tmp.CompressFiles(@"d:\Temp\arch.7z", @"d:\Temp\log.txt");
tmp.CompressDirectory(@"c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\1033", @"D:\Temp\arch.7z");

 

 

压缩ZIP文件

 

SevenZipCompressor tmp = new SevenZipCompressor();
tmp.ArchiveFormat = OutArchiveFormat.Zip;
tmp.CompressFiles(@"d:\Temp\arch.zip", @"d:\Temp\gpl.txt", @"d:\Temp\ru_office.txt");

 

多线程解压缩

Thread t1 = new Thread(() =>
{
    using (SevenZipExtractor tmp = new SevenZipExtractor(@"D:\Temp\7z465_extra.7z"))
    {
        tmp.FileExtractionStarted += new EventHandler<FileInfoEventArgs>((s, e) =>
        {
            Console.WriteLine(String.Format("[{0}%] {1}",
                e.PercentDone, e.FileInfo.FileName));
        });
        tmp.ExtractionFinished += new EventHandler((s, e) => { Console.WriteLine("Finished!"); });
        tmp.ExtractArchive(@"D:\Temp\t1");
    }
});

 

Thread t2 = new Thread(() =>
{
    using (SevenZipExtractor tmp = new SevenZipExtractor(@"D:\Temp\7z465_extra.7z"))
    {
        tmp.FileExtractionStarted += new EventHandler<FileInfoEventArgs>((s, e) =>
        {
            Console.WriteLine(String.Format("[{0}%] {1}",
                e.PercentDone, e.FileInfo.FileName));
        });
        tmp.ExtractionFinished += new EventHandler((s, e) => { Console.WriteLine("Finished!"); });
        tmp.ExtractArchive(@"D:\Temp\t2");
    }
});

 

t1.Start();
t2.Start();
t1.Join();
t2.Join();

 

 

多线程压缩

Thread t1 = new Thread(() =>
{
    SevenZipCompressor tmp = new SevenZipCompressor();
    tmp.FileCompressionStarted += new EventHandler<FileNameEventArgs>((s, e) =>
    {
        Console.WriteLine(String.Format("[{0}%] {1}",
            e.PercentDone, e.FileName));
    });
    tmp.CompressDirectory(@"D:\Temp\t1", @"D:\Temp\arch1.7z");

});

 

Thread t2 = new Thread(() =>
{
    SevenZipCompressor tmp = new SevenZipCompressor();
    tmp.FileCompressionStarted += new EventHandler<FileNameEventArgs>((s, e) =>
    {
        Console.WriteLine(String.Format("[{0}%] {1}",
            e.PercentDone, e.FileName));
    });
    tmp.CompressDirectory(@"D:\Temp\t2", @"D:\Temp\arch2.7z");
});
t1.Start();
t2.Start();
t1.Join();
t2.Join();


以上是关于C#实现文件或文件夹压缩和解压的主要内容,如果未能解决你的问题,请参考以下文章

C#实现Zip压缩解压实例

c# gzip压缩后,解压出来文件不能用了

C#和Java的文件压缩。

是否可以动态编译和执行 C# 代码片段?

C#工具类:使用SharpZipLib进行压缩解压文件

C#工具类:使用SharpZipLib进行压缩解压文件