| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- using ICSharpCode.SharpZipLib.Zip;
- using ICSharpCode.SharpZipLib.Checksums;
- namespace HXX.Scanner.Common
- {
- /// <summary>
- /// 压缩解压zip类
- /// </summary>
- public class ZipManager
- {
- /// 递归压缩文件夹方法
- public static bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName)
- {
- if (!Directory.Exists(FolderToZip))
- {
- return false;
- }
- bool res = true;
- string[] folders, filenames;
- ZipEntry entry = null;
- FileStream fs = null;
- Crc32 crc = new Crc32();
- try
- {
- //创建当前文件夹
- entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/")); //加上 “/” 才会当成是文件夹创建
- s.PutNextEntry(entry);
- s.Flush();
- //先压缩文件,再递归压缩文件夹
- filenames = Directory.GetFiles(FolderToZip);
- foreach (string file in filenames)
- {
- //打开压缩文件
- fs = File.OpenRead(file);
- byte[] buffer = new byte[fs.Length];
- fs.Read(buffer, 0, buffer.Length);
- string targetFileName = Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file);
- if (targetFileName.StartsWith("/"))
- {
- targetFileName = targetFileName.Substring(1);
- }
- entry = new ZipEntry(Path.Combine(ParentFolderName, targetFileName));
- 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);
- }
- }
- catch (Exception ee)
- {
- res = false;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- fs = null;
- }
- if (entry != null)
- {
- entry = null;
- }
- }
- folders = Directory.GetDirectories(FolderToZip);
- foreach (string folder in folders)
- {
- if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))
- {
- return false;
- }
- }
- return res;
- }
- /// <summary>
- /// 压缩目录
- /// </summary>
- /// <param name="FolderToZip">待压缩的文件夹,全路径格式</param>
- /// <param name="ZipedFile">压缩后的文件名,全路径格式</param>
- /// <param name="Password"></param>
- /// <returns></returns>
- public static bool ZipFileDictory(string FolderToZip, string ZipedFile, String Password)
- {
- bool res;
- if (!Directory.Exists(FolderToZip))
- {
- return false;
- }
- ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile));
- s.SetLevel(6);
- s.Password = Password;
- res = ZipFileDictory(FolderToZip, s, "");
- s.Finish();
- s.Close();
- return res;
- }
- /// <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)
- {
- //如果文件没有找到,则报错
- if (!File.Exists(FileToZip))
- {
- throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");
- }
- //FileStream fs = null;
- FileStream ZipFile = null;
- ZipOutputStream ZipStream = null;
- ZipEntry ZipEntry = null;
- bool res = true;
- try
- {
- ZipFile = File.OpenRead(FileToZip);
- byte[] buffer = new byte[ZipFile.Length];
- ZipFile.Read(buffer, 0, buffer.Length);
- ZipFile.Close();
- ZipFile = File.Create(ZipedFile);
- ZipStream = new ZipOutputStream(ZipFile);
- ZipStream.Password = Password;
- ZipEntry = new ZipEntry(Path.GetFileName(FileToZip));
- ZipStream.PutNextEntry(ZipEntry);
- ZipStream.SetLevel(6);
- ZipStream.Write(buffer, 0, buffer.Length);
- }
- catch
- {
- res = false;
- }
- finally
- {
- if (ZipEntry != null)
- {
- ZipEntry = null;
- }
- if (ZipStream != null)
- {
- ZipStream.Finish();
- ZipStream.Close();
- }
- if (ZipFile != null)
- {
- ZipFile.Close();
- ZipFile = null;
- }
- GC.Collect();
- GC.Collect(1);
- }
- return res;
- }
- /// <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)
- {
- if (Directory.Exists(FileToZip))
- {
- return ZipFileDictory(FileToZip, ZipedFile, Password);
- }
- else if (File.Exists(FileToZip))
- {
- return ZipFile(FileToZip, ZipedFile, Password);
- }
- else
- {
- return false;
- }
- }
- /// <summary>
- /// 解压功能(解压压缩文件到指定目录)
- /// </summary>
- /// <param name="FileToUpZip">待解压的文件</param>
- /// <param name="ZipedFolder">指定解压目标目录</param>
- /// <param name="Password"></param>
- public static void UnZip(string FileToUpZip, string ZipedFolder, string Password)
- {
- if (!File.Exists(FileToUpZip))
- {
- return;
- }
- if (!Directory.Exists(ZipedFolder))
- {
- Directory.CreateDirectory(ZipedFolder);
- }
- ZipInputStream s = null;
- ZipEntry theEntry = null;
- string fileName;
- FileStream streamWriter = null;
- try
- {
- s = new ZipInputStream(File.OpenRead(FileToUpZip));
- s.Password = Password;
- while ((theEntry = s.GetNextEntry()) != null)
- {
- if (theEntry.Name != String.Empty)
- {
- fileName = Path.Combine(ZipedFolder, theEntry.Name);
- /**/
- ///判断文件路径是否是文件夹
- if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
- {
- Directory.CreateDirectory(fileName);
- continue;
- }
- streamWriter = File.Create(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;
- }
- }
- }
- }
- }
- finally
- {
- if (streamWriter != null)
- {
- streamWriter.Close();
- streamWriter = null;
- }
- if (theEntry != null)
- {
- theEntry = null;
- }
- if (s != null)
- {
- s.Close();
- s = null;
- }
- GC.Collect();
- GC.Collect(1);
- }
- }
- ///// <summary>
- ///// 解压功能(解压压缩文件到指定目录)
- ///// </summary>
- ///// <param name="FileToUpZip">待解压的文件</param>
- ///// <param name="ZipedFolder">指定解压目标目录</param>
- ///// <param name="Password"></param>
- //public static void UnZip(Stream stream, string ZipedFolder, string Password)
- //{
- // if (!Directory.Exists(ZipedFolder))
- // {
- // Directory.CreateDirectory(ZipedFolder);
- // }
- // ZipInputStream s = null;
- // ZipEntry theEntry = null;
- // string fileName;
- // FileStream streamWriter = null;
- // int count = 0;
- // //byte[] data = new byte[131070];
- // byte[] data = new byte[65535];
- // try
- // {
- // s = new ZipInputStream(stream);
- // s.Password = Password;
- // while ((theEntry = s.GetNextEntry()) != null)
- // {
- // if (theEntry.Name != String.Empty && theEntry.Name != "last")
- // {
- // fileName = Path.Combine(ZipedFolder, theEntry.Name);
- // /**/
- // ///判断文件路径是否是文件夹
- // if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
- // {
- // Directory.CreateDirectory(fileName);
- // continue;
- // }
- // streamWriter = File.Create(fileName);
- // while (true)
- // {
- // count = s.Read(data, 0, data.Length);
- // if (count > 0)
- // {
- // streamWriter.Write(data, 0, count);
- // }
- // else
- // {
- // break;
- // }
- // }
- // }
- // }
- // }
- // catch (Exception ee)
- // {
- // if (ee.Message.IndexOf("EOF") == -1)
- // {
- // throw ee;
- // }
- // }
- // finally
- // {
- // if (streamWriter != null)
- // {
- // streamWriter.Close();
- // streamWriter = null;
- // }
- // if (theEntry != null)
- // {
- // theEntry = null;
- // }
- // if (s != null)
- // {
- // s.Close();
- // s = null;
- // }
- // GC.Collect();
- // }
- //}
- /// <summary>
- /// 解压功能(解压压缩文件到指定目录)
- /// </summary>
- /// <param name="FileToUpZip">待解压的文件</param>
- /// <param name="ZipedFolder">指定解压目标目录</param>
- /// <param name="Password"></param>
- public static void UnZip(Stream stream, string ZipedFolder, string Password)
- {
- if (!Directory.Exists(ZipedFolder))
- {
- Directory.CreateDirectory(ZipedFolder);
- }
- ZipInputStream s = null;
- ZipEntry theEntry = null;
- string fileName;
- //FileStream streamWriter = null;
- int count = 0;
- //byte[] data = new byte[131070];
- byte[] data = new byte[65535];
- try
- {
- s = new ZipInputStream(stream);
- s.Password = Password;
- while ((theEntry = s.GetNextEntry()) != null)
- {
- if (theEntry.Name != String.Empty && theEntry.Name != "last")
- {
- fileName = Path.Combine(ZipedFolder, theEntry.Name);
- /**/
- ///判断文件路径是否是文件夹
- if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
- {
- Directory.CreateDirectory(fileName);
- continue;
- }
- using (FileStream streamWriter = File.Create(fileName))
- {
- while (true)
- {
- count = s.Read(data, 0, data.Length);
- if (count > 0)
- {
- streamWriter.Write(data, 0, count);
- }
- else
- {
- break;
- }
- }
- }
- }
- }
- }
- catch (Exception ee)
- {
- if (ee.Message.IndexOf("EOF") == -1)
- {
- throw ee;
- }
- }
- finally
- {
- //if (streamWriter != null)
- //{
- // streamWriter.Close();
- // streamWriter = null;
- //}
- if (theEntry != null)
- {
- theEntry = null;
- }
- if (s != null)
- {
- s.Close();
- s = null;
- }
- GC.Collect();
- }
- }
- //public static void UnZip(Stream stream, string ZipedFolder, string Password)
- //{
- // if (!Directory.Exists(ZipedFolder))
- // {
- // Directory.CreateDirectory(ZipedFolder);
- // }
- // ZipInputStream s = null;
- // ZipEntry theEntry = null;
- // string fileName;
- // FileStream streamWriter = null;
- // int count = 0;
- // byte[] data = new byte[65535];
- // try
- // {
- // s = new ZipInputStream(stream);
- // s.Password = Password;
- // while ((theEntry = s.GetNextEntry()) != null)
- // {
- // if (theEntry.Name != String.Empty && theEntry.Name != "last")
- // {
- // fileName = Path.Combine(ZipedFolder, theEntry.Name);
- // /**/
- // ///判断文件路径是否是文件夹
- // if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
- // {
- // Directory.CreateDirectory(fileName);
- // continue;
- // }
- // streamWriter = File.Create(fileName);
- // byte[] buffer = new byte[655350];
- // while (true)
- // {
- // count = s.Read(buffer, 0, buffer.Length);
- // if (count > 0)
- // {
- // streamWriter.Write(buffer, 0, count);
- // }
- // else
- // {
- // break;
- // }
- // }
- // }
- // }
- // }
- // catch (Exception ee)
- // {
- // if (ee.Message.IndexOf("EOF") == -1)
- // {
- // throw ee;
- // }
- // }
- // finally
- // {
- // if (streamWriter != null)
- // {
- // streamWriter.Close();
- // streamWriter = null;
- // }
- // if (theEntry != null)
- // {
- // theEntry = null;
- // }
- // if (s != null)
- // {
- // s.Close();
- // s = null;
- // }
- // GC.Collect();
- // }
- //}
- public static Dictionary<string, List<byte>> UnZip(Stream stream)
- {
- ZipInputStream s = null;
- ZipEntry theEntry = null;
- string fileName;
- int count = 0;
- byte[] data = new byte[65535];
- Dictionary<string, List<byte>> result = new Dictionary<string, List<byte>>();
- List<byte> bPhoto;
- byte[] temp;
- try
- {
- s = new ZipInputStream(stream);
- s.Password = string.Empty;
- while ((theEntry = s.GetNextEntry()) != null)
- {
- if (theEntry.Name != String.Empty && theEntry.Name != "last")
- {
- //fileName = Path.Combine(ZipedFolder, theEntry.Name);
- fileName = theEntry.Name;
- /**/
- ///判断文件路径是否是文件夹
- if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
- {
- //Directory.CreateDirectory(fileName);
- continue;
- }
- bPhoto = new List<byte>();
- while (true)
- {
- count = s.Read(data, 0, data.Length);
- if (count > 0)
- {
- if (count == data.Length)
- {
- bPhoto.AddRange(data);
- }
- else
- {
- temp = new byte[count];
- Array.Copy(data, temp, count);
- bPhoto.AddRange(temp);
- }
- }
- else
- {
- break;
- }
- }
- if (bPhoto.Count > 0)
- {
- result.Add(fileName, bPhoto);
- }
- }
- }
- }
- catch (Exception ee)
- {
- if (ee.Message.IndexOf("EOF") == -1)
- {
- throw ee;
- }
- }
- finally
- {
- //if (streamWriter != null)
- //{
- // streamWriter.Close();
- // streamWriter = null;
- //}
- if (theEntry != null)
- {
- theEntry = null;
- }
- if (s != null)
- {
- s.Close();
- s = null;
- }
- GC.Collect();
- }
- return result;
- }
- }
- }
|