Cuando se trabaja con ficheros en asp.net, especialmente para aquellos que en alguna ocasión han tenido que luchar con los gestores documentales, una actividad necesaria es la posibilidad de poder comprimir una carpeta junto con todo su contenido para poder enviarla al navegador del usaurio para que la descargue.

Pues, nuevamente, nuestro objetivo será crear una clase sencilla utilizan la libreria ICSHARPCODE que pueden descargarse de Libreria, y que utilizar para comprimir facilmente.

Ahora sí, implementemos nuestra clase:

Primeramente declaramos una clase, en mi caso la llame NZIP.

Public class NZip

End Class

Nuestro segundo paso, será crear nuestras variables dentro de esa clase:

        Private _Password As String

        Private _Zip_File As String

        Private _Compression As eCompression = 6

        Private Files() As sFiles

        Private NbFiles As Integer

        Private UnByte As Long = 1024

La primer variable _Password será necesaria solo si queremos colocarle password a nuestro archivo

La segunda _Zip_File para el archivo a comprimir

La Tercer _compression es para el grado de compresion

Las demás las veremos más adelante

 

Nuestro tercer paso, sera crear un metodo enum para exponer los metodos de compresion disponibles

Public Enum eCompression

            None = 0

            Standard = 5

            Maximum = 10

        End Enum

Luego creamos una estructura

   Public Structure sFiles

            Dim PhysicalFile As String

            Dim MappedFile As String

        End Structure

Por supuesto, debemos crear las propiedades que serán las que usemos para llenar nuestra clase. Basicamente serían

Public Sub New(ByVal Zip_File As String, Optional ByVal Password As String = "")

            _Zip_File = Zip_File

            _Password = Password

            NbFiles = 0

            ReDim Files(NbFiles)

        End Sub

        Public ReadOnly Property ZipFile() As String

            Get

                Return _Zip_File

            End Get

        End Property

        Public Property Password() As String

            Get

                Return _Password

            End Get

            Set(ByVal NewPassword As String)

                _Password = NewPassword

            End Set

        End Property

        Public Property Compression() As eCompression

            Get

                Return _Compression

            End Get

            Set(ByVal NewValue As eCompression)

                _Compression = NewValue

            End Set

        End Property

Y para terminar nuestra clase, crearemos los metodos addfile, addfiles, zip. No los explicaré pues realmente son sencillos. Así que querdaría así:

 

 Public Sub AddFile(ByVal PhysicalFile As String, Optional ByVal MappedFile As String = "")

            NbFiles += 1

            ReDim Preserve Files(NbFiles)

            If MappedFile = "" Then MappedFile = PhysicalFile.Substring(PhysicalFile.LastIndexOf("\") + 1)

            Files(NbFiles).PhysicalFile = PhysicalFile

            Files(NbFiles).MappedFile = MappedFile

        End Sub

        Public Sub AddFolder(ByVal Folder As String, Optional ByVal MappedPath As String = "")

            If MappedPath <> "" Then

                If MappedPath.EndsWith("\") = False Then

                    MappedPath &= "\"

                End If

            End If

            AddFiles(Folder, MappedPath)

            Dim FoldersToAdd As String() = Directory.GetDirectories(Folder)

            Dim CurrentFolder As String

            For Each CurrentFolder In FoldersToAdd

                AddFolder(CurrentFolder, MappedPath & CurrentFolder.Substring(CurrentFolder.LastIndexOf("\") + 1))

            Next

        End Sub

        Public Sub AddFiles(ByVal Folder As String, Optional ByVal MappedPath As String = "")

            Dim FilesToAdd As String() = Directory.GetFiles(Folder)

            Dim CurrentFile As String

            If MappedPath <> "" Then

                If MappedPath.EndsWith("\") = False Then

                    MappedPath &= "\"

                End If

            End If

            For Each CurrentFile In FilesToAdd

                AddFile(CurrentFile, MappedPath & Path.GetFileName(CurrentFile))

            Next

        End Sub



        Public Sub CreateZip()

            Dim i As Integer


            Dim strmZipFile As System.IO.FileStream

            strmZipFile = System.IO.File.Create(_Zip_File)

            'Déclarations pour les fichiers à ajouter

            Dim strmStreamToZip As System.IO.FileStream

            Dim strmZipStream As ICSharpCode.SharpZipLib.Zip.ZipOutputStream

            Dim myZipEntry As ICSharpCode.SharpZipLib.Zip.ZipEntry

            Dim abyBuffer(UnByte) As Byte

            Dim nSize As System.Int32

            Dim Facteur As Integer = 1

            strmZipStream = New ICSharpCode.SharpZipLib.Zip.ZipOutputStream(strmZipFile)

            For i = 1 To NbFiles

                'Initialisation du fichier en cours

                strmStreamToZip = New System.IO.FileStream(Files(i).PhysicalFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)

                myZipEntry = New ICSharpCode.SharpZipLib.Zip.ZipEntry(Files(i).MappedFile)

                'Password

                strmZipStream.Password = _Password

                'Définition du fichier dans le zip

                strmZipStream.PutNextEntry(myZipEntry)

                strmZipStream.SetLevel(6)

                nSize = strmStreamToZip.Read(abyBuffer, 0, abyBuffer.Length)

                strmZipStream.Write(abyBuffer, 0, nSize)

               

                Try

                    While (nSize < strmStreamToZip.Length)

                        Dim nSizeRead As Integer

                        nSizeRead = strmStreamToZip.Read(abyBuffer, 0, abyBuffer.Length)

                        strmZipStream.Write(abyBuffer, 0, nSizeRead)

                        nSize = nSize + nSizeRead



                    End While

                Catch Ex As System.Exception

                    Throw Ex

                End Try

                strmStreamToZip.Close()

            Next

            strmZipStream.Finish()

            strmZipStream.Close()

          

        End Sub

Una vez que nuestra clase esta lista, nada mas debemos instansiarla desde el lugar donde queremos comprimir, así:

Dim Zip As New crabit.NZip("c:\myzip.zip")
                   Zip.AddFolder("c:\prueba")
                  Zip.CreateZip()