Monday, July 26, 2010 11:22 AM
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()
