/*******************************************************************************
* Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
* 类的信息:
* 1.程序名称:ZipFileClass.cs
* 2.功能描述:压缩文件
* 编辑履历:
* 作者 日期 版本 修改内容
* 陈晓野 2014/09/04 1.00 新建
*******************************************************************************/
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
namespace Dongke.IBOSS.PRD.Service.DKIBOSSPRDLogic
{
///
/// 解压/压缩文件
///
public static class ZipFileClass
{
///
/// 压缩文件
///
/// 文件名
/// 压缩文件名
public static void ZipFile(string strFile, string strZip)
{
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
strFile += Path.DirectorySeparatorChar;
using (ZipOutputStream s = new ZipOutputStream(File.Create(strZip)))
{
//BZip2OutputStream bZip2 = new BZip2OutputStream(File.Create(strZip));
//GZipOutputStream gZip = new GZipOutputStream(File.Create(strZip));
s.SetLevel(7); // 0 - store only to 9 - means best compression
Zip(strFile, s, strFile);
s.Finish();
s.Close();
}
}
///
/// 压缩文件
///
///
///
///
private static void Zip(string strFile, ZipOutputStream s, 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))
{
Zip(file, s, staticFile);
}
else // 否则直接压缩文件
{
//打开压缩文件
using (FileStream fs = File.OpenRead(file))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
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;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
}
}
///
/// 解压缩文件
///
/// 目标文件
/// 解压文件
///
public static string UnZipFile(string TargetFile, string fileDir)
{
string rootFile = " ";
//读取压缩文件(zip文件),准备解压缩
using (ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim())))
{
ZipEntry theEntry;
string path = fileDir;
//解压出来的文件保存的路径
string rootDir = " ";
//根目录下的第一个子文件夹的名称
while ((theEntry = s.GetNextEntry()) != null)
{
rootDir = Path.GetDirectoryName(theEntry.Name);
//得到根目录下的第一级子文件夹的名称
if (rootDir.IndexOf("\\") >= 0)
{
rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
}
string dir = Path.GetDirectoryName(theEntry.Name);
//根目录下的第一级子文件夹的下的文件夹的名称
string fileName = Path.GetFileName(theEntry.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)
{
using (FileStream streamWriter = File.Create(path + "\\" + fileName))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
}
s.Close();
return rootFile;
}
}
///
/// 压缩文件夹
///
/// 要压缩的目录
/// 输出的压缩文件
public static void DirectoryToZip(string path, string address)
{
// 获取当前文件夹中的所有文件
string[] filenames = Directory.GetFiles(path);
Crc32 crc = new Crc32();
// 创建输出文件
ZipOutputStream zos = new ZipOutputStream(File.Create(address));
zos.SetLevel(6);
// 遍历所有文件
foreach (string name in filenames)
{
FileStream fs = File.OpenRead(name);
byte[] buffer = new byte[fs.Length];
// 读取文件
fs.Read(buffer, 0, Convert.ToInt32(fs.Length));
// 获取文件的文件名和后缀名
string file = Path.GetFileName(name);
// 输出文件的名称
ZipEntry entry = new ZipEntry(file);
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
zos.PutNextEntry(entry);
zos.Write(buffer, 0, Convert.ToInt32(fs.Length));
fs.Close();
}
zos.Finish();
zos.Close();
}
}
}