C#压缩和解压工具类

openkk 12年前

压缩和解压缩,支持子文件夹

using System;  using System.Collections.Generic;  using System.Text;  using System.IO;  using System.IO.Packaging;    namespace CMD.EDI  {      public class ZipHandler      {          public static void Compress(FileInfo fi, DirectoryInfo dir)          {              if (fi.Exists)              {                  fi.Delete();              }                            Package zipFilePackage = ZipPackage.Open(fi.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite);                foreach (FileInfo physicalFile in dir.GetFiles())              {                  string physicalfilePath = physicalFile.FullName;                    Uri partUri = PackUriHelper.CreatePartUri(new Uri(physicalFile.Name, UriKind.Relative));                    PackagePart newFilePackagePart = zipFilePackage.CreatePart(partUri, System.Net.Mime.MediaTypeNames.Text.Xml);                    byte[] fileContent = File.ReadAllBytes(physicalfilePath);                    newFilePackagePart.GetStream().Write(fileContent, 0, fileContent.Length);              }                foreach (DirectoryInfo subDir in dir.GetDirectories())              {                  foreach (FileInfo physicalFile in subDir.GetFiles())                  {                      string physicalfilePath = physicalFile.FullName;                        Uri partUri = PackUriHelper.CreatePartUri(new Uri(subDir.Name + "/" + physicalFile.Name, UriKind.Relative));                        PackagePart newFilePackagePart = zipFilePackage.CreatePart(partUri, System.Net.Mime.MediaTypeNames.Text.Xml);                        byte[] fileContent = File.ReadAllBytes(physicalfilePath);                        newFilePackagePart.GetStream().Write(fileContent, 0, fileContent.Length);                  }              }                zipFilePackage.Close();          }            public static bool Decompress(FileInfo fi, string origName)          {              bool returnVal = false;                string curFile = fi.FullName;                Package zipFilePackage = ZipPackage.Open(curFile, FileMode.Open, FileAccess.ReadWrite);                foreach (ZipPackagePart contentFile in zipFilePackage.GetParts())              {                  CreateFile(origName, contentFile);                  returnVal = true;              }                zipFilePackage.Close();                return returnVal;          }            private static void CreateFile(string rootFolder, ZipPackagePart contentFile)          {              // Initially create file under the folder specified              string contentFilePath = string.Empty;              contentFilePath = contentFile.Uri.OriginalString.Replace('/',                               System.IO.Path.DirectorySeparatorChar);                if (contentFilePath.StartsWith(                  System.IO.Path.DirectorySeparatorChar.ToString()))              {                  contentFilePath = contentFilePath.TrimStart(                                           System.IO.Path.DirectorySeparatorChar);              }              else              {                  //do nothing              }                contentFilePath = System.IO.Path.Combine(rootFolder, contentFilePath);              //contentFilePath =  System.IO.Path.Combine(rootFolder, contentFilePath);                 //Check for the folder already exists. If not then create that folder                if (System.IO.Directory.Exists(                  System.IO.Path.GetDirectoryName(contentFilePath)) != true)              {                  System.IO.Directory.CreateDirectory(                            System.IO.Path.GetDirectoryName(contentFilePath));              }              else              {                  //do nothing              }                System.IO.FileStream newFileStream =                      System.IO.File.Create(contentFilePath);              newFileStream.Close();              byte[] content = new byte[contentFile.GetStream().Length];              contentFile.GetStream().Read(content, 0, content.Length);              System.IO.File.WriteAllBytes(contentFilePath, content);          }      }  }