sábado, 10 de outubro de 2009

Compactando e Descompactando arquivos através de sua aplicação ASP.Net

Fala, galera!!


Segue um código interessante para compactar e descompactar arquivos.


O código a seguir utiliza uma DLL de terceiros (open source) que pode ser baixada aqui.



    Public Sub DescompactarArquivoDiretorio(ByVal sArquivoZip As String, ByVal sDiretorioParaDescompactar As String)
        Dim oMeuZip As New ICSharpCode.SharpZipLib.Zip.FastZip
        oMeuZip.ExtractZip(sArquivoZip, sDiretorioParaDescompactar, ".*")
    End Sub


    Public Sub CompactarArquivo(ByVal sArquivoOrigem As String, ByVal sArquivoDestino As String)
        Dim sz As New ICSharpCode.SharpZipLib.Zip.FastZip
        Dim sArquivoZip As String = String.Empty

        ' Crio um arquivo do tipo stream, aprontando para o meu zip de destino.
        Dim strmZipOutputStream As ICSharpCode.SharpZipLib.Zip.ZipOutputStream
        strmZipOutputStream = New ICSharpCode.SharpZipLib.Zip.ZipOutputStream(File.Create(sArquivoDestino))
        ' Seto o nível de compressão (0->Sem compressão / 9-> Compressão Máxima)
        strmZipOutputStream.SetLevel(9)
        ' Leio o arquivo de origem
        Dim strmFile As FileStream = File.OpenRead(sArquivoOrigem)
        Dim abyBuffer(strmFile.Length - 1) As Byte
        strmFile.Read(abyBuffer, 0, abyBuffer.Length)
        ' Aqui eu trato para pegar somente o arquivo, sem os diretórios
        ' O split é um método que separa a string, de acordo com um caractere, no meu caso "\"
        ' Cada indice da minha matriz é um diretório, e o ultimo é o arquivo
        Dim sAuxArquivo As String() = Split(sArquivoOrigem, "\")
        ' Crio uma variável, adicionando o meu Arquivo ao Zip
        ' Com ubound, eu pego o ultimo índice da minha matriz, que é o nome do meu arquivo.
        Dim objZipEntry As ICSharpCode.SharpZipLib.Zip.ZipEntry = New  ICSharpCode.SharpZipLib.Zip.ZipEntry(sAuxArquivo(UBound(sAuxArquivo)))
        ' Seto a data de criação
        objZipEntry.DateTime = DateTime.Now
        ' Informo o tamanho do stream. (Do meu arquivo a ser zipado)
        objZipEntry.Size = strmFile.Length
        ' Fecho meu stream para liberar memória
        strmFile.Close()
        ' Adiciono no objeto para gerar o zip.
        strmZipOutputStream.PutNextEntry(objZipEntry)
        strmZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length)
        ' "Limpo" o objeto
        strmZipOutputStream.Finish()
        strmZipOutputStream.Close()
    End Sub



É isso ae.

Um abraço e até a próxima!!

2 comentários:

  1. opa cara blz?
    vc sabe me dizer pq isso não funciona qunado esta na locaweb?

    ResponderExcluir
  2. Olá, Alberto!

    Verifique as permissões de escrita no diretório da sua aplicação.

    Abraços!

    ResponderExcluir