203 lines
7.1 KiB
C#
203 lines
7.1 KiB
C#
using SharpCompress.Archives;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Text;
|
||
using System.Linq;
|
||
using SharpCompress.Readers;
|
||
using SharpCompress.Writers;
|
||
using SharpCompress.Common;
|
||
|
||
namespace AutoPekage
|
||
{
|
||
class ZipControl
|
||
{
|
||
|
||
|
||
|
||
public delegate void NewFileDecompressHandle(string filePath);
|
||
|
||
public static event NewFileDecompressHandle NewFileDecompress;
|
||
|
||
public delegate bool FileWillDecompressHandle(string filePath);
|
||
|
||
public static event FileWillDecompressHandle FileWillDecompress;
|
||
/// <summary>
|
||
/// ZIP:解压一个zip文件
|
||
/// add yuangang by 2016-06-13
|
||
/// </summary>
|
||
/// <param name="ZipFile">需要解压的Zip文件(绝对路径)</param>
|
||
/// <param name="Password">解压密码</param>
|
||
/// <param name="OverWrite">是否覆盖已存在的文件</param>
|
||
public static void UnZip(string ZipFile, string Password, bool OverWrite = true)
|
||
{
|
||
//如果解压到的目录不存在,则报错
|
||
//if (!System.IO.Directory.Exists(Form1.tempPath))
|
||
//{
|
||
// Directory.CreateDirectory(Form1.tempPath);
|
||
//}
|
||
|
||
//using (ZipInputStream zipfiles = new ZipInputStream(File.OpenRead(ZipFile)))
|
||
//{
|
||
// zipfiles.Password = Password;
|
||
// ZipEntry theEntry;
|
||
|
||
// while ((theEntry = zipfiles.GetNextEntry()) != null)
|
||
// {
|
||
// string pathToZip = "";
|
||
// pathToZip = theEntry.Name;
|
||
|
||
// string fileName = Path.GetFileName(pathToZip);
|
||
|
||
// if (fileName != "")
|
||
// {
|
||
// string filePath = Path.Combine(Form1.tempPath, fileName);
|
||
// if ((File.Exists(Form1.tempPath + fileName) && OverWrite) || (!File.Exists(filePath)))
|
||
// {
|
||
// using (FileStream streamWriter = File.Create(filePath))
|
||
// {
|
||
// int size = 2048;
|
||
// byte[] data = new byte[2048];
|
||
// while (true)
|
||
// {
|
||
// size = zipfiles.Read(data, 0, data.Length);
|
||
|
||
// if (size > 0)
|
||
// streamWriter.Write(data, 0, size);
|
||
// else
|
||
// break;
|
||
// }
|
||
// streamWriter.Close();
|
||
// }
|
||
// if (NewFileDecompress != null)
|
||
// {
|
||
// NewFileDecompress(filePath);
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
// zipfiles.Close();
|
||
//}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 压缩文件
|
||
/// </summary>
|
||
/// <param name="zipPath">压缩文件路径</param>
|
||
/// <param name="fileList">文件列表</param>
|
||
public static void Zip(string zipPath, List<string> fileList)
|
||
{
|
||
//ZipOutputStream zipStream = null;
|
||
//FileStream streamWriter = null;
|
||
//try
|
||
//{
|
||
// //Use Crc32
|
||
// Crc32 crc32 = new Crc32();
|
||
|
||
// //Create Zip File
|
||
// zipStream = new ZipOutputStream(File.Create(zipPath));
|
||
|
||
// //Specify Level
|
||
// zipStream.SetLevel(9);
|
||
|
||
// //Foreach File
|
||
// foreach (string file in fileList)
|
||
// {
|
||
// //Check Whether the file exists
|
||
// if (!File.Exists(file))
|
||
// {
|
||
// throw new FileNotFoundException(file);
|
||
// }
|
||
|
||
// //Read the file to stream
|
||
// streamWriter = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||
// byte[] buffer = new byte[streamWriter.Length];
|
||
// streamWriter.Read(buffer, 0, buffer.Length);
|
||
// streamWriter.Close();
|
||
|
||
// //Specify ZipEntry
|
||
// crc32.Reset();
|
||
// crc32.Update(buffer);
|
||
// ZipEntry zipEntry = new ZipEntry(Path.GetFileName(file));
|
||
// zipEntry.DateTime = DateTime.Now;
|
||
// zipEntry.Size = buffer.Length;
|
||
// zipEntry.Crc = crc32.Value;
|
||
|
||
// //Put file info into zip stream
|
||
// zipStream.PutNextEntry(zipEntry);
|
||
|
||
// //Put file data into zip stream
|
||
// zipStream.Write(buffer, 0, buffer.Length);
|
||
// }
|
||
//}
|
||
//catch
|
||
//{
|
||
// throw;
|
||
//}
|
||
//finally
|
||
//{
|
||
// //Clear Resource
|
||
// if (streamWriter != null)
|
||
// {
|
||
// streamWriter.Close();
|
||
// }
|
||
// if (zipStream != null)
|
||
// {
|
||
// zipStream.Finish();
|
||
// zipStream.Close();
|
||
// }
|
||
//}
|
||
|
||
using (Stream stream = File.OpenWrite(zipPath))
|
||
{
|
||
using (var writer = WriterFactory.Open(stream, ArchiveType.Zip, new WriterOptions(CompressionType.Deflate)
|
||
{
|
||
LeaveStreamOpen = true
|
||
}))
|
||
{
|
||
foreach (var file in fileList)
|
||
{
|
||
writer.Write(Path.GetFileName(file), file);
|
||
}
|
||
}
|
||
if (!stream.CanWrite)
|
||
{
|
||
throw new InvalidOperationException();
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void UnCompress(string ZipFile, string unCompressPath, bool OverWrite = true)
|
||
{
|
||
if (!Directory.Exists(unCompressPath))
|
||
{
|
||
Directory.CreateDirectory(unCompressPath);
|
||
}
|
||
using (Stream stream = File.OpenRead(ZipFile))
|
||
using (var archive = ArchiveFactory.Open(stream))
|
||
{
|
||
SharpCompress.Common.ArchiveEncoding.Default = Encoding.Default;
|
||
foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory))
|
||
{
|
||
if (FileWillDecompress != null)
|
||
{
|
||
if (!FileWillDecompress(entry.Key))
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
entry.WriteToDirectory(unCompressPath, new ExtractionOptions()
|
||
{
|
||
Overwrite = true
|
||
});
|
||
if (NewFileDecompress != null)
|
||
{
|
||
NewFileDecompress(Path.Combine(unCompressPath, Path.GetFileName(entry.Key)));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|