Compactando arquivos (zip)

<< Click to Display Table of Contents >>

Navigation:  ASP.NET > Dicas avançadas >

Compactando arquivos (zip)

Previous pageReturn to chapter overviewNext page

Link para componente free

 

ICSharpCode.SharpZipLib.dll

http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx

 

Default.aspx

 

  <form id="form1" runat="server">

  <div>

      <br />

      <asp:Button ID="btnCompacDir" runat="server" OnClick="btnCompacDir_Click" Text="Compactar um diretorio" />

      <br />

      <br />

      <asp:Button ID="btnCompac1" runat="server" OnClick="btnCompac1_Click" Text="Compactar um arquivo" />

      <br />

      <br />

      <br />

      <asp:Button ID="btnDescompactar" runat="server" OnClick="btnDescompactar_Click" Text="Descompactar" />

  </div>

  </form>

 

Default.aspx.cs

 

using System;

using System.Web;

using System.IO;

using ICSharpCode.SharpZipLib.Zip;

 

public partial class _Default : System.Web.UI.Page

{

  protected void Page_Load(object sender, EventArgs e)

   {

   }

 

  // modo 1 - compactar um diretorio e seus subs, gerando 1 arquivo zip

  public void GerarZipDeDiretorio(string DiretorioOrigem, string DiretorioDestino)

   {

      // valida diretorios

      if (!DiretorioOrigem.EndsWith("\\"))

           DiretorioOrigem += "\\";

 

      if (!DiretorioDestino.EndsWith("\\"))

           DiretorioDestino += "\\";

 

      if (!Directory.Exists(DiretorioDestino) || !Directory.Exists(DiretorioOrigem))

       {

          // diretório destino OU origem não existe

          return;

       }

 

      FastZip zip = new FastZip();

      string nomeArquivo = "Zipado.zip"; // gerar nome de arquivo aleatório: +Guid.NewGuid().ToString().Substring(0, 6) + ".zip";

       zip.CreateZip(DiretorioDestino + nomeArquivo, DiretorioOrigem, true, "");

 

      // joga arquivo zip para browser!

      HttpContext.Current.Response.TransmitFile(DiretorioDestino + nomeArquivo);

 

       zip = null;

   }

 

  // modo 2 - gerar um zip de um unico arquivo

  public void GerarZipDeUmArquivo(string Arquivo, string DiretorioDestino)

   {

      // arquivo não existe

      if (!File.Exists(Arquivo))

          return;

 

      if (!DiretorioDestino.EndsWith("\\"))

           DiretorioDestino += "\\";

 

      if (!Directory.Exists(DiretorioDestino))

       {

          // diretório destino OU origem não existe

          return;

       }

 

      FastZip zip = new FastZip();

      string nomeArquivo = "ZipadoUnico.zip"; // gerar nome de arquivo aleatório: +Guid.NewGuid().ToString().Substring(0, 6) + ".zip";

       zip.CreateZip(DiretorioDestino + nomeArquivo, Path.GetDirectoryName(Arquivo), false, Path.GetFileName(Arquivo));

 

      HttpContext.Current.Response.TransmitFile(DiretorioDestino + nomeArquivo);

       zip = null;

   }

 

  // descompactar um arquivo zip para um destino

  public void Descompactar(string ArquivoZip, string DiretorioDestino)

   {

      if (!File.Exists(ArquivoZip))

       {

          // arquivo não existe

          return;

       }

 

      if (!DiretorioDestino.EndsWith("\\"))

           DiretorioDestino += "\\";

 

      if (!Directory.Exists(DiretorioDestino))

       {

          // diretório destino OU origem não existe

          return;

       }

 

      FastZip zip = new FastZip();

       zip.ExtractZip(ArquivoZip, DiretorioDestino, "");

       zip = null;

   }

 

  // modo 3 - compactar 1 arquivo, porém usando stream - mais complicado

  public void GerarZipDeUmArquivoStream(string Arquivo, string DiretorioDestino)

   {

      // arquivo não existe

      if (!File.Exists(Arquivo))

          return;

 

      if (!DiretorioDestino.EndsWith("\\"))

           DiretorioDestino += "\\";

 

      if (!Directory.Exists(DiretorioDestino))

       {

          // diretório destino OU origem não existe

          return;

       }

 

      string ArquivoZip = "ZipadoUnicoStream.zip";

      ZipOutputStream zstream = new ZipOutputStream(File.Create(DiretorioDestino + ArquivoZip));

 

      // compressão máxima

       zstream.SetLevel(9);

 

      // lê o arquivo, byte a byte

      FileStream fstream = File.OpenRead(Arquivo);

      Byte[] bt = new Byte[fstream.Length];

       fstream.Read(bt, 0, bt.Length);

 

      string[] auxiliar = Arquivo.Split('\\');

      ZipEntry entry = new ZipEntry(auxiliar[auxiliar.Length - 1]);

 

       entry.DateTime = DateTime.Now;

       entry.Size = fstream.Length;

 

       fstream.Close();

 

       zstream.PutNextEntry(entry);

       zstream.Write(bt, 0, bt.Length);

       zstream.Finish();

       zstream.Close();

 

      HttpContext.Current.Response.TransmitFile(DiretorioDestino + ArquivoZip);

   }

 

  protected void btnCompacDir_Click(object sender, EventArgs e)

   {

       GerarZipDeDiretorio(Server.MapPath("") + "\\origem", Server.MapPath("") + "\\destino");

   }

 

  protected void btnCompac1_Click(object sender, EventArgs e)

   {

      // compactar 1 arquivo - modo simples

       GerarZipDeUmArquivo(Server.MapPath("") + "\\origem\\Pioneiros auxiliares em março 2010.doc", Server.MapPath("") + "\\destino");

 

      // compactar 1 arquivo - modo stream

       GerarZipDeUmArquivoStream(Server.MapPath("") + "\\origem\\Pioneiros auxiliares em março 2010.doc", Server.MapPath("") + "\\destino");

   }

 

  protected void btnDescompactar_Click(object sender, EventArgs e)

   {

       Descompactar(Server.MapPath("") + "\\origem\\Zipado.zip", Server.MapPath("") + "\\destino\\a");

   }

}