A pesar de que la continuidad de J# está mas que cuestionada, todavía puede ser útil para varias cosas entre ellas comprimir archivos.

Desarrollando una aplicación Web en .Net hemos tenido la necesidad de comprimir varios archivos en un fichero Zip y enviarlos al cliente Web de forma transparente para el usuario.

Existen numerosas librerías para trabajar con ficheros Zip, pero encontramos una forma sencilla de trabajar con los ficheros Zip desde un programa VB.Net (también válido para C#). El Framework 1.1 de Microsoft (y también el 2.0) incorporan el lenguaje J# que es un “pariente de Java”, luego “java.util.zip” debe existir en algún lado. Si alguien se pregunta si existe en C# la respuesta es no :-(

Efectivamente J# contiene “java.util.zip” y está dentro de “vjslib.dll”. Primero, nos aseguramos que tenemos en nuestro servidor/pc está librería, sino la tenéis podéis descargaros el “Paquete redistribuible de Microsoft Visual J# .NET versión 1.1” (o en inglés “Microsoft Visual J# .NET Version 1.1 Redistributable Package”) en esta dirección.

Añadiendo una referencia a la librería vjslib.dll en nuestro proyecto ya podemos utilizar las funciones que necesitamos para acceder a los ficheros zip como en el siguiente ejemplo:


Imports java.util
Imports java.util.zip
Imports java.io

' Función auxiliar que copia los bytes de un inputStream a un outputStream
Public Shared Sub CopyStream(ByVal inputStream _
       As java.io.InputStream, _
       ByRef outputStream As java.io.OutputStream)
  Dim buffer(8192) As SByte
  Dim got As Integer
  got = inputStream.read(buffer, 0, buffer.Length)
  While got > 0
    outputStream.write(buffer, 0, got)
    got = inputStream.read(buffer, 0, buffer.Length)
  End While
  outputStream.flush()
End Sub

Public Function createZip(ByVal zipPath As String, _
  ByVal files2Zip As System.Collections.ArrayList) _
  As Boolean  
  Dim zipOutputStream As zipOutputStream
  Dim zipEntry As zipEntry
  Dim fileInputStream As java.io.FileInputStream
  Dim file2Zip As String
  Dim auxObj As Object
  ' Esta variable contiene el valor que la
  ' función retornara

  Dim created = True Try
 
' Crea el fichero zip
  zipOutputStream = New _
    zipOutputStream(New _
    java.io.FileOutputStream(zipPath))
  If Not files2Zip Is Nothing Then
    For Each
auxObj In files2Zip
      file2Zip = CType(auxObj, String)
      zipEntry = New _
      zipEntry(System.IO.Path.GetFileName(file2Zip))
      ' Comprimimos los datos
      zipEntry.setMethod(zipEntry.DEFLATED)
      ' Añadimos el fichero al zip
      zipOutputStream.putNextEntry(zipEntry)
      Try
        fileInputStream = New _
          java.io.FileInputStream (file2Zip)
        Try
          CopyStream(fileInputStream, _
          zipOutputStream)
        Finally
          fileInputStream.close()
        End Try
      Catch
e As Exception
        created = False
      Finally

        zipOutputStream.closeEntry()
      End Try
    Next
  End If
Catch
e As Exception
  created = False
Finally
  If Not
zipOutputStream Is Nothing Then
    zipOutputStream.close()
  End If
End Try
Return created
End Function

Be Sociable, Share!