You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

500 lines
18 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Zip;
using System.Text.RegularExpressions;
using ICSharpCode.SharpZipLib.Checksum;
using System.IO.Compression;
namespace KPlan.RefActions {
public class ZipHelper {
#region 压缩
/* private static string get_uft8(string unicodeString)
{
 Encoding ec = Encoding.GetEncoding("iso-8859-1");
byte[] btArr = ec.GetBytes(unicodeString);
            string strBuffer = Encoding.Default.GetString(btArr);
return strBuffer;
}*/
/// <summary>
/// 递归压缩文件夹的内部方法
/// </summary>
/// <param name="folderToZip">要压缩的文件夹路径</param>
/// <param name="zipStream">压缩输出流</param>
/// <param name="parentFolderName">此文件夹的上级文件夹</param>
/// <returns></returns>
///
private static bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName, string skipFolder) {
// 出现乱码就是因为CodePage不对
bool result = true;
string[] folders, files;
ZipEntry ent = null;
FileStream fs = null;
Crc32 crc = new Crc32();
string[] skipFolders = Regex.Split(skipFolder, "@@", RegexOptions.IgnoreCase);
try {
Console.WriteLine("parentFolderName----------------" + parentFolderName);
Console.WriteLine("folderToZip----------------" + folderToZip);
// 出现乱码就是因为CodePage不对
/*
FileStream fs1 = new FileStream("D:\\ss.txt", FileMode.Open);
StreamWriter sw = new StreamWriter(fs1);
//开始写入
sw.Write(parentFolderName);
sw.Write(folderToZip);
//清空缓冲区
sw.Flush();
//关闭流
sw.Close();
fs1.Close();*/
string[] sArray = Regex.Split(folderToZip, "Data", RegexOptions.IgnoreCase);
//ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/"));
string newFoldToZip = "";
if (sArray.Length == 1) {
newFoldToZip = "Data";
}
else {
newFoldToZip = "Data" + sArray[1];
}
string newParentFoldToZip = "";
if (parentFolderName.Length > 0) {
sArray = Regex.Split(parentFolderName, "Data", RegexOptions.IgnoreCase);
if (sArray.Length == 1) {
newParentFoldToZip = "Data\\";
}
else {
newParentFoldToZip = "Data" + sArray[1];
}
}
//Console.WriteLine("------------------1--------"+Path.GetFileName(newFoldToZip) + "/");
//Console.WriteLine("-------------------2-------"+Path.Combine(parentFolderName, Path.GetFileName(newFoldToZip) + "/"));
ent = new ZipEntry(Path.Combine(newParentFoldToZip, Path.GetFileName(newFoldToZip) + "/"));
/* Encoding gbk = Encoding.GetEncoding("gbk");
ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = gbk.CodePage; */
zipStream.PutNextEntry(ent);
zipStream.Flush();
files = Directory.GetFiles(folderToZip);
foreach (string file in files) {
if (skipFolders.Contains<string>(Path.GetFileName(file))) {
continue;
}
fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
//ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file)));
string newParentFoldToZip2 = "";
if (parentFolderName.Length > 0) {
sArray = Regex.Split(parentFolderName, "Data", RegexOptions.IgnoreCase);
if (sArray.Length == 1) {
newParentFoldToZip2 = "Data\\";
}
else {
newParentFoldToZip2 = "Data" + sArray[1];
}
}
//Console.WriteLine("------------------3--------" + Path.GetFileName(newFoldToZip) + "/");
//Console.WriteLine("------------------4--------" + Path.Combine(newParentFoldToZip2, Path.GetFileName(newFoldToZip) + "/"));
ent = new ZipEntry(Path.Combine(newParentFoldToZip2, Path.GetFileName(newFoldToZip) + "/" + Path.GetFileName(file)));
ent.DateTime = DateTime.Now;
ent.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
ent.Crc = crc.Value;
zipStream.PutNextEntry(ent);
zipStream.Write(buffer, 0, buffer.Length);
}
}
catch {
result = false;
}
finally {
if (fs != null) {
fs.Close();
fs.Dispose();
}
if (ent != null) {
ent = null;
}
GC.Collect();
GC.Collect(1);
}
folders = Directory.GetDirectories(folderToZip);
foreach (string folder in folders) {
if (skipFolders.Contains<string>(Path.GetFileName(folder))) {
continue;
}
if (!ZipDirectory(folder, zipStream, folderToZip, skipFolder))
return false;
}
return result;
}
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="folderToZip">要压缩的文件夹路径</param>
/// <param name="zipedFile">压缩文件完整路径</param>
/// <param name="password">密码</param>
/// <returns>是否压缩成功</returns>
public static bool ZipDirectory(string folderToZip, string zipedFile, string password, string skipFolder) {
bool result = false;
Console.WriteLine("folderToZip-------------" + folderToZip);
if (!Directory.Exists(folderToZip)) {
Console.WriteLine("不存在----------");
return result;
}
/* Encoding gbk = Encoding.GetEncoding("gbk");
ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = gbk.CodePage; */
ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));
Console.WriteLine("zipedFile-------------" + zipedFile);
zipStream.SetLevel(6);
if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
Console.WriteLine("skipFolder-------------" + skipFolder);
result = ZipDirectory(folderToZip, zipStream, "", skipFolder);
zipStream.Finish();
zipStream.Close();
return result;
}
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="folderToZip">要压缩的文件夹路径</param>
/// <param name="zipedFile">压缩文件完整路径</param>
/// <returns>是否压缩成功</returns>
public static bool ZipDirectory(string folderToZip, string zipedFile, string skipFolder) {
bool result = ZipDirectory(folderToZip, zipedFile, null, skipFolder);
return result;
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileToZip">要压缩的文件全名</param>
/// <param name="zipedFile">压缩后的文件名</param>
/// <param name="password">密码</param>
/// <returns>压缩结果</returns>
public static bool ZipFile(string fileToZip, string zipedFile, string password) {
bool result = true;
ZipOutputStream zipStream = null;
FileStream fs = null;
ZipEntry ent = null;
if (!File.Exists(fileToZip))
return false;
try {
fs = File.OpenRead(fileToZip);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
fs = File.Create(zipedFile);
zipStream = new ZipOutputStream(fs);
if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
ent = new ZipEntry(Path.GetFileName(fileToZip));
zipStream.PutNextEntry(ent);
zipStream.SetLevel(6);
zipStream.Write(buffer, 0, buffer.Length);
}
catch {
result = false;
}
finally {
if (zipStream != null) {
zipStream.Finish();
zipStream.Close();
}
if (ent != null) {
ent = null;
}
if (fs != null) {
fs.Close();
fs.Dispose();
}
}
GC.Collect();
GC.Collect(1);
return result;
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileToZip">要压缩的文件全名</param>
/// <param name="zipedFile">压缩后的文件名</param>
/// <returns>压缩结果</returns>
public static bool ZipFile(string fileToZip, string zipedFile) {
bool result = ZipFile(fileToZip, zipedFile, null);
return result;
}
/// <summary>
/// 压缩文件或文件夹
/// </summary>
/// <param name="fileToZip">要压缩的路径</param>
/// <param name="zipedFile">压缩后的文件名</param>
/// <param name="password">密码</param>
/// <returns>压缩结果</returns>
public static bool Zip(string fileToZip, string zipedFile, string password) {
bool result = false;
if (Directory.Exists(fileToZip))
result = ZipDirectory(fileToZip, zipedFile, password, null);
else if (File.Exists(fileToZip))
result = ZipFile(fileToZip, zipedFile, password);
return result;
}
/// <summary>
/// 压缩文件或文件夹
/// </summary>
/// <param name="fileToZip">要压缩的路径</param>
/// <param name="zipedFile">压缩后的文件名</param>
/// <returns>压缩结果</returns>
public static bool Zip(string fileToZip, string zipedFile) {
bool result = Zip(fileToZip, zipedFile, null);
return result;
}
#endregion
#region 解压
/// <summary>
/// 解压功能(解压压缩文件到指定目录)
/// </summary>
/// <param name="fileToUnZip">待解压的文件</param>
/// <param name="zipedFolder">指定解压目标目录</param>
/// <param name="password">密码</param>
/// <returns>解压结果</returns>
public static bool UnZip(string fileToUnZip, string zipedFolder, string password) {
bool result = true;
FileStream fs = null;
ZipInputStream zipStream = null;
ZipEntry ent = null;
string fileName;
if (!File.Exists(fileToUnZip))
return false;
if (!Directory.Exists(zipedFolder))
Directory.CreateDirectory(zipedFolder);
try {
zipStream = new ZipInputStream(File.OpenRead(fileToUnZip));
if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
while ((ent = zipStream.GetNextEntry()) != null) {
if (!string.IsNullOrEmpty(ent.Name)) {
fileName = Path.Combine(zipedFolder, ent.Name);
fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi
if (fileName.EndsWith("\\")) {
Directory.CreateDirectory(fileName);
continue;
}
fs = File.Create(fileName);
int size = 2048;
byte[] data = new byte[size];
while (true) {
size = zipStream.Read(data, 0, data.Length);
if (size > 0)
fs.Write(data, 0, data.Length);
else
break;
}
}
}
}
catch {
result = false;
}
finally {
if (fs != null) {
fs.Close();
fs.Dispose();
}
if (zipStream != null) {
zipStream.Close();
zipStream.Dispose();
}
if (ent != null) {
ent = null;
}
GC.Collect();
GC.Collect(1);
}
return result;
}
public static bool UnZips(string zipFilePath, string unZipDir) {
if (zipFilePath == string.Empty) {
throw new Exception("压缩文件不能为空!");
}
if (!File.Exists(zipFilePath)) {
throw new FileNotFoundException("压缩文件不存在!");
}
//解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
if (unZipDir == string.Empty)
unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
if (!unZipDir.EndsWith("\\"))
unZipDir += "\\";
Console.WriteLine("解压目录-------------------------" + unZipDir);
if (!Directory.Exists(unZipDir))
Directory.CreateDirectory(unZipDir);
Util.KUtil.Log("解压文件:"+zipFilePath+" -> "+unZipDir);
KPlan.Util.KUtil.UnZipDirectory(zipFilePath, unZipDir);
/*ZipArchive archive = null;
using (archive = System.IO.Compression.ZipFile.OpenRead(zipFilePath)){
foreach(ZipArchiveEntry entry in archive.Entries) {
entry.ExtractToFile(Path.Combine(unZipDir, entry.FullName), true);
}
}*/
//System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, unZipDir);
/*using (var s = new ZipInputStream(File.OpenRead(zipFilePath))) {
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null) {
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
Util.KUtil.Log(directoryName + "||" + fileName);
if (!string.IsNullOrEmpty(directoryName)) {
Directory.CreateDirectory(unZipDir + directoryName);
}
if (directoryName != null && !directoryName.EndsWith("/")) {
}
if (fileName != String.Empty) {
using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)) {
int size;
byte[] data = new byte[2048];
while (true) {
size = s.Read(data, 0, data.Length);
if (size > 0) {
streamWriter.Write(data, 0, size);
}
else {
break;
}
}
}
}
}
}*/
return true;
}
public static bool UnZipVoid(string FileToUpZip, string ZipedFolder) {
if (!File.Exists(FileToUpZip)) {
return false;
}
if (!Directory.Exists(ZipedFolder)) {
Directory.CreateDirectory(ZipedFolder);
}
ZipInputStream sInput = new ZipInputStream(File.OpenRead(FileToUpZip));
try {
ZipEntry theEntry;
while ((theEntry = sInput.GetNextEntry()) != null) {
if (theEntry.Name != String.Empty) {
string fileName = Path.Combine(ZipedFolder, theEntry.Name);
//判断文件路径是否是文件夹
if (fileName.EndsWith("/") || fileName.EndsWith("\\")) {
Directory.CreateDirectory(fileName);
continue;
}
string newDir = Path.GetDirectoryName(fileName);
if (!Directory.Exists(newDir)) {
Directory.CreateDirectory(newDir);
}
FileStream streamWriter = File.Create(fileName);
try {
int size = 2048;
byte[] data = new byte[2048];
while (true) {
size = sInput.Read(data, 0, data.Length);
if (size <= 0) {
break;
}
streamWriter.Write(data, 0, size);
}
}
finally {
streamWriter.Close();
streamWriter.Dispose();
streamWriter = null;
}
}
}
}
finally {
sInput.Close();
sInput.Dispose();
sInput = null;
}
return true;
}
/// <summary>
/// 解压功能(解压压缩文件到指定目录)
/// </summary>
/// <param name="fileToUnZip">待解压的文件</param>
/// <param name="zipedFolder">指定解压目标目录</param>
/// <returns>解压结果</returns>
public static bool UnZip(string fileToUnZip, string zipedFolder) {
bool result = UnZip(fileToUnZip, zipedFolder, null);
return result;
}
#endregion
}
}