C#实现文件夹压缩到zip以及解压
2011-03-30 16:16
573 查看
需要用到SharpLibZip。代码如下:
Zip.cs
public class Zip
{
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="dirPath">压缩文件夹的路径</param>
/// <param name="fileName">生成的zip文件路径</param>
/// <param name="level">压缩级别 0 - 9 0是存储级别 9是最大压缩</param>
/// <param name="bufferSize">读取文件的缓冲区大小</param>
public void CompressDirectory(string dirPath,string fileName,int level,int bufferSize)
{
byte[] buffer = new byte[bufferSize];
using (ZipOutputStream s = new ZipOutputStream(File.Create(fileName)))
{
s.SetLevel(level);
CompressDirectory(dirPath, dirPath, s, buffer);
s.Finish();
s.Close();
}
}
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="root">压缩文件夹路径</param>
/// <param name="path">压缩文件夹内当前要压缩的文件夹路径</param>
/// <param name="s"></param>
/// <param name="buffer">读取文件的缓冲区大小</param>
private void CompressDirectory(string root, string path, ZipOutputStream s, byte[] buffer)
{
root = root.TrimEnd('//') + "//";
string[] fileNames = Directory.GetFiles(path);
string[] dirNames = Directory.GetDirectories(path);
string relativePath = path.Replace(root, "");
if (relativePath != "")
{
relativePath = relativePath.Replace("//", "/") + "/";
}
int sourceBytes;
foreach (string file in fileNames)
{
ZipEntry entry = new ZipEntry(relativePath + Path.GetFileName(file));
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
s.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
foreach (string dirName in dirNames)
{
string relativeDirPath = dirName.Replace(root, "");
ZipEntry entry = new ZipEntry(relativeDirPath.Replace("//", "/") + "/");
s.PutNextEntry(entry);
CompressDirectory(root, dirName, s, buffer);
}
}
/// <summary>
/// 解压缩zip文件
/// </summary>
/// <param name="zipFilePath">解压的zip文件路径</param>
/// <param name="extractPath">解压到的文件夹路径</param>
/// <param name="bufferSize">读取文件的缓冲区大小</param>
public void Extract(string zipFilePath, string extractPath, int bufferSize)
{
extractPath = extractPath.TrimEnd('//') + "//";
byte[] data = new byte[bufferSize];
int size;
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry entry;
while ((entry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(entry.Name);
string fileName = Path.GetFileName(entry.Name);
//先创建目录
if (directoryName.Length > 0)
{
Directory.CreateDirectory(extractPath + directoryName);
}
if (fileName != String.Empty)
{
using (FileStream streamWriter = File.Create(extractPath + entry.Name.Replace("/", "//")))
{
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
}
}
}
}
}
网上找了很久 包括老外的site也找了 没找到现成的 自己写了一个
使用方法:
Zip z = new Zip();
z.Extract("c://cc.zip","c://haha", 4096); z.Extract("cc.zip","c://haha", 4096); z.Extract("c://cc.zip","haha", 4096);
//上面的解压缩没啥大问题
z.CompressDirectory("E://DotNet_Library//SharpZipLib//SharpZipLib_0860_SourceSamples", "c://aa.zip", 9, 4096);
这个代码有一点点小问题 没有异常处理 压缩过程中 有文件被编辑或者被删除 那就无法压缩了
如果这样那也会异常:
z.CompressDirectory("C://CC", "C://CC//1.zip", 9, 4096);
Zip.cs
public class Zip
{
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="dirPath">压缩文件夹的路径</param>
/// <param name="fileName">生成的zip文件路径</param>
/// <param name="level">压缩级别 0 - 9 0是存储级别 9是最大压缩</param>
/// <param name="bufferSize">读取文件的缓冲区大小</param>
public void CompressDirectory(string dirPath,string fileName,int level,int bufferSize)
{
byte[] buffer = new byte[bufferSize];
using (ZipOutputStream s = new ZipOutputStream(File.Create(fileName)))
{
s.SetLevel(level);
CompressDirectory(dirPath, dirPath, s, buffer);
s.Finish();
s.Close();
}
}
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="root">压缩文件夹路径</param>
/// <param name="path">压缩文件夹内当前要压缩的文件夹路径</param>
/// <param name="s"></param>
/// <param name="buffer">读取文件的缓冲区大小</param>
private void CompressDirectory(string root, string path, ZipOutputStream s, byte[] buffer)
{
root = root.TrimEnd('//') + "//";
string[] fileNames = Directory.GetFiles(path);
string[] dirNames = Directory.GetDirectories(path);
string relativePath = path.Replace(root, "");
if (relativePath != "")
{
relativePath = relativePath.Replace("//", "/") + "/";
}
int sourceBytes;
foreach (string file in fileNames)
{
ZipEntry entry = new ZipEntry(relativePath + Path.GetFileName(file));
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
s.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
foreach (string dirName in dirNames)
{
string relativeDirPath = dirName.Replace(root, "");
ZipEntry entry = new ZipEntry(relativeDirPath.Replace("//", "/") + "/");
s.PutNextEntry(entry);
CompressDirectory(root, dirName, s, buffer);
}
}
/// <summary>
/// 解压缩zip文件
/// </summary>
/// <param name="zipFilePath">解压的zip文件路径</param>
/// <param name="extractPath">解压到的文件夹路径</param>
/// <param name="bufferSize">读取文件的缓冲区大小</param>
public void Extract(string zipFilePath, string extractPath, int bufferSize)
{
extractPath = extractPath.TrimEnd('//') + "//";
byte[] data = new byte[bufferSize];
int size;
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry entry;
while ((entry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(entry.Name);
string fileName = Path.GetFileName(entry.Name);
//先创建目录
if (directoryName.Length > 0)
{
Directory.CreateDirectory(extractPath + directoryName);
}
if (fileName != String.Empty)
{
using (FileStream streamWriter = File.Create(extractPath + entry.Name.Replace("/", "//")))
{
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
}
}
}
}
}
网上找了很久 包括老外的site也找了 没找到现成的 自己写了一个
使用方法:
Zip z = new Zip();
z.Extract("c://cc.zip","c://haha", 4096); z.Extract("cc.zip","c://haha", 4096); z.Extract("c://cc.zip","haha", 4096);
//上面的解压缩没啥大问题
z.CompressDirectory("E://DotNet_Library//SharpZipLib//SharpZipLib_0860_SourceSamples", "c://aa.zip", 9, 4096);
这个代码有一点点小问题 没有异常处理 压缩过程中 有文件被编辑或者被删除 那就无法压缩了
如果这样那也会异常:
z.CompressDirectory("C://CC", "C://CC//1.zip", 9, 4096);
相关文章推荐
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- C#实现zip压缩和解压
- C#实现Zip压缩解压实例
- 将文件夹压缩成zip包以及解压zip包到指定的文件夹
- C# 实现ZIP 压缩和解压
- C#实现Zip压缩解压实例【转】
- C#实现Zip压缩解压实例
- C#多级文件夹及文件的zip压缩解压
- vc复制文件夹实现(可以复制三层路径)以及zip压缩实现
- C#实现Zip压缩解压实例
- C#实现Zip压缩解压实例
- zip压缩与解压文件夹或文件
- Asp.net 2.0 C#实现压缩/解压功能 (示例代码下载)
- java实现zip压缩文件/文件夹
- 使用apache.tool.zip 对文件以及文件夹进行压缩
- java压缩及解压(.zip)文件文件夹
- C#解压或压缩文件夹
- JAVA实现实用的ZIP压缩与解压
- 跨平台的zip文件压缩处理,支持压缩解压文件夹
- C#实现压缩和解压缩的方法示例【Gzip和Zip方式】