123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- using System;
- using System.IO;
- using System.Diagnostics;
- using Microsoft.Win32;
- using ICSharpCode.SharpZipLib.Checksums;
- using ICSharpCode.SharpZipLib.Zip;
- ///压缩、解压缩类
- namespace Ant.Service.Utilities
- {
- public class SharpZip
- {
- public SharpZip()
- { }
- /// <summary>
- /// 压缩
- /// </summary>
- /// <param name="filename"> 压缩后的文件名(包含物理路径)</param>
- /// <param name="directory">待压缩的文件夹(包含物理路径)</param>
- public static void PackFiles(string filename, string directory)
- {
- try
- {
- FastZip fz = new FastZip();
- fz.CreateEmptyDirectories = true;
- fz.CreateZip(filename, directory, true, "");
- fz = null;
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// 解压缩
- /// </summary>
- /// <param name="file">待解压文件名(包含物理路径)</param>
- /// <param name="dir"> 解压到哪个目录中(包含物理路径)</param>
- public static bool UnpackFiles(string file, string dir)
- {
- try
- {
- if (!Directory.Exists(dir))
- {
- Directory.CreateDirectory(dir);
- }
- ZipInputStream s = new ZipInputStream(File.OpenRead(file));
- ZipEntry theEntry;
- while ((theEntry = s.GetNextEntry()) != null)
- {
- string directoryName = Path.GetDirectoryName(theEntry.Name);
- string fileName = Path.GetFileName(theEntry.Name);
- if (directoryName != String.Empty)
- {
- Directory.CreateDirectory(dir + directoryName);
- }
- if (fileName != String.Empty)
- {
- FileStream streamWriter = File.Create(dir + theEntry.Name);
- 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 true;
- }
- catch (Exception)
- {
- throw;
- }
- }
- }
- public class ClassZip
- {
- #region 私有方法
- /// <summary>
- /// 递归压缩文件夹方法
- /// </summary>
- private static bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName)
- {
- 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);
- entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file)));
- 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
- {
- res = false;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- fs = null;
- }
- if (entry != null)
- {
- entry = null;
- }
- GC.Collect();
- GC.Collect(1);
- }
- 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>
- private static bool ZipFileDictory(string FolderToZip, string ZipedFile, int level)
- {
- bool res;
- if (!Directory.Exists(FolderToZip))
- {
- return false;
- }
- ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile));
- s.SetLevel(level);
- res = ZipFileDictory(FolderToZip, s, "");
- s.Finish();
- s.Close();
- return res;
- }
- /// <summary>
- /// 压缩文件
- /// </summary>
- /// <param name="FileToZip">要进行压缩的文件名</param>
- /// <param name="ZipedFile">压缩后生成的压缩文件名</param>
- private static bool ZipFile(string FileToZip, string ZipedFile, int level)
- {
- if (!File.Exists(FileToZip))
- {
- throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");
- }
- 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);
- ZipEntry = new ZipEntry(Path.GetFileName(FileToZip));
- ZipStream.PutNextEntry(ZipEntry);
- ZipStream.SetLevel(level);
- 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;
- }
- #endregion
- /// <summary>
- /// 压缩
- /// </summary>
- /// <param name="FileToZip">待压缩的文件目录</param>
- /// <param name="ZipedFile">生成的目标文件</param>
- /// <param name="level">6</param>
- public static bool Zip(String FileToZip, String ZipedFile, int level)
- {
- if (Directory.Exists(FileToZip))
- {
- return ZipFileDictory(FileToZip, ZipedFile, level);
- }
- else if (File.Exists(FileToZip))
- {
- return ZipFile(FileToZip, ZipedFile, level);
- }
- else
- {
- return false;
- }
- }
- /// <summary>
- /// 解压
- /// </summary>
- /// <param name="FileToUpZip">待解压的文件</param>
- /// <param name="ZipedFolder">解压目标存放目录</param>
- public static void UnZip(string FileToUpZip, string ZipedFolder)
- {
- 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));
- 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);
- }
- }
- }
- public class ZipHelper
- {
- #region 私有变量
- String the_rar;
- RegistryKey the_Reg;
- Object the_Obj;
- String the_Info;
- ProcessStartInfo the_StartInfo;
- Process the_Process;
- #endregion
- /// <summary>
- /// 压缩
- /// </summary>
- /// <param name="zipname">要解压的文件名</param>
- /// <param name="zippath">要压缩的文件目录</param>
- /// <param name="dirpath">初始目录</param>
- public void EnZip(string zipname, string zippath, string dirpath)
- {
- try
- {
- the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command");
- the_Obj = the_Reg.GetValue("");
- the_rar = the_Obj.ToString();
- the_Reg.Close();
- the_rar = the_rar.Substring(1, the_rar.Length - 7);
- the_Info = " a " + zipname + " " + zippath;
- the_StartInfo = new ProcessStartInfo();
- the_StartInfo.FileName = the_rar;
- the_StartInfo.Arguments = the_Info;
- the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
- the_StartInfo.WorkingDirectory = dirpath;
- the_Process = new Process();
- the_Process.StartInfo = the_StartInfo;
- the_Process.Start();
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message);
- }
- }
- /// <summary>
- /// 解压缩
- /// </summary>
- /// <param name="zipname">要解压的文件名</param>
- /// <param name="zippath">要解压的文件路径</param>
- public void DeZip(string zipname, string zippath)
- {
- try
- {
- the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");
- the_Obj = the_Reg.GetValue("");
- the_rar = the_Obj.ToString();
- the_Reg.Close();
- the_rar = the_rar.Substring(1, the_rar.Length - 7);
- the_Info = " X " + zipname + " " + zippath;
- the_StartInfo = new ProcessStartInfo();
- the_StartInfo.FileName = the_rar;
- the_StartInfo.Arguments = the_Info;
- the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
- the_Process = new Process();
- the_Process.StartInfo = the_StartInfo;
- the_Process.Start();
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message);
- }
- }
- }
- }
|