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#实现文件或文件夹压缩和解压的主要内容,如果未能解决你的问题,请参考以下文章