栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#实现的文件压缩和解压缩类

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#实现的文件压缩和解压缩类

本文实例讲述了C#实现的文件压缩和解压缩类。分享给大家供大家参考。具体分析如下:

这个C#代码包含了几个类,封装了文件压缩和解压缩常用的方法,包括直接通过代码进行压缩,也有调用winrar对文件进行压缩的

using System;
using System.IO;
using System.Diagnostics;
using Microsoft.Win32;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
///压缩、解压缩类
namespace DotNet.Utilities
{
  public class SharpZip
  {
    public SharpZip()
    { }
    /// 
    /// 压缩
    ///  
    ///  压缩后的文件名(包含物理路径)
    /// 待压缩的文件夹(包含物理路径)
    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;
      }
    }
    /// 
    /// 解压缩
    /// 
    /// 待解压文件名(包含物理路径)
    ///  解压到哪个目录中(包含物理路径)
    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 私有方法
    /// 
    /// 递归压缩文件夹方法
    /// 
    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;
    }
    /// 
    /// 压缩目录
    /// 
    /// 待压缩的文件夹,全路径格式
    /// 压缩后的文件名,全路径格式
    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;
    }
    /// 
    /// 压缩文件
    /// 
    /// 要进行压缩的文件名
    /// 压缩后生成的压缩文件名
    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
    /// 
    /// 压缩
    /// 
    /// 待压缩的文件目录
    /// 生成的目标文件
    /// 6
    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;
      }
    }
    /// 
    /// 解压
    /// 
    /// 待解压的文件
    /// 解压目标存放目录
    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
    /// 
    /// 压缩
    /// 
    /// 要解压的文件名
    /// 要压缩的文件目录
    /// 初始目录
    public void EnZip(string zipname, string zippath, string dirpath)
    {
      try
      {
 the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRAR.exeShellOpenCommand");
 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);
      }
    }
    /// 
    /// 解压缩
    /// 
    /// 要解压的文件名
    /// 要解压的文件路径
    public void DeZip(string zipname, string zippath)
    {
      try
      {
 the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRar.exeShellOpenCommand");
 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);
      }
    }
  }
}

希望本文所述对大家的C#程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/125661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号