Technical Support
🟢 Online now
Hello 👋

How can we help you today?
Contact on WhatsApp
B4X Store
jdashboardUI / Archivos y compresión / ZipFile + ZipFileHeader
Archivos y compresión

ZipFile + ZipFileHeader

ZIP avanzado con SmartCompression, AES, streams, progreso asíncrono e inspección de entradas

Buscar en toda jdashboardUI
Fuente
jdashboardUI.b4xlib · Solo API pública
Idioma de la tienda: es

Files & Compression · jdashboardUI · B4J · Zip4j 2.11.6

ZipFile es el servicio ZIP de jdashboardUI. Está construido sobre Zip4j 2.11.6 y ofrece una API B4J para crear, modificar, leer, cifrar, extraer e inspeccionar archivos ZIP.

ZipFileHeader es su clase acompañante: representa una entrada concreta dentro del ZIP y expone su nombre, tamaños, CRC, método de compresión, estado de cifrado, fecha y otros metadatos.

Los dos módulos se documentan juntos porque se usan como una sola unidad:

ZipFile
 └── FileNames / getFileName(...)
       └── ZipFileHeader

Características destacadas

  • Crear ZIP y añadir uno o varios archivos.
  • Añadir carpetas completas conservando estructura.
  • SmartCompression: usa STORE para formatos que ya están comprimidos.
  • Niveles de compresión desde NO_COMPRESSION hasta ULTRA.
  • Cifrado AES y ZIP_STANDARD.
  • Ejemplo incluido para AES 256-bit.
  • Extraer todo el ZIP o solamente una entrada.
  • Leer texto o bytes directamente desde el ZIP sin extraerlos.
  • Obtener un InputStream de una entrada.
  • Añadir datos desde un InputStream.
  • Renombrar y eliminar entradas dentro del ZIP.
  • Comentario global del archivo ZIP.
  • Charset configurable para nombres y comentarios.
  • Detectar archivos ZIP cifrados.
  • Validar la integridad estructural del ZIP.
  • Detectar ZIP divididos y fusionarlos.
  • Ejecución en segundo plano mediante RunInThread.
  • Progreso, archivo actual, tarea actual, bytes procesados, pausa, reanudación y cancelación.
  • Estadísticas: archivos, directorios, tamaño comprimido/no comprimido y ratio.
  • Acceso al objeto nativo Zip4j mediante Obj.
  • Inspección de entradas con ZipFileHeader.

Dependencia

El manifiesto de jdashboardUI.b4xlib declara:

zip4j-2.11.6.jar

Por tanto, la implementación está basada específicamente en Zip4j 2.11.6.

Si B4J informa que no encuentra esa dependencia, asegúrate de que zip4j-2.11.6.jar esté disponible en las librerías adicionales de tu instalación.


Inicialización básica

Private Zip As ZipFile

Private Sub CreateArchive
    Dim ZipPath As String = File.Combine(File.DirApp, "backup.zip")
    Zip.Initialize(ZipPath)
End Sub

El archivo ZIP se crea cuando se añade la primera entrada.

ZIP protegido con contraseña

Private Zip As ZipFile

Private Sub OpenEncryptedArchive
    Dim ZipPath As String = File.Combine(File.DirApp, "secure.zip")
    Zip.InitializeWithPassword(ZipPath, "Secret123")
End Sub

También puedes establecer o cambiar la contraseña después:

Zip.SetPassword("Secret123")

Propiedades B4X de ZipFile

Los accesores públicos getX/setX compatibles se documentan como propiedades B4X normales.

Propiedad Acceso Tipo Uso
Obj lectura Object Objeto nativo net.lingala.zip4j.ZipFile
Obj2 lectura Object Alias del objeto nativo
RunInThread lectura / escritura Boolean Ejecuta operaciones Zip4j en segundo plano
SmartCompression lectura / escritura Boolean Activa selección STORE/DEFLATE
LastError lectura String Último error registrado
HasError lectura Boolean True si LastError no está vacío
Comment lectura / escritura String Comentario global del ZIP
FileNames lectura List Lista de ZipFileHeader, no Strings
FileHeaders lectura List Lista nativa de FileHeader de Zip4j
ProgressMonitor lectura Object Monitor nativo de progreso
IsBusy lectura Boolean Operación asíncrona activa
ProgressPercent lectura Int Porcentaje 0–100
ProgressFile lectura String Archivo actual
ProgressTask lectura String Tarea actual
ProgressState lectura String Estado del monitor
ProgressResult lectura String Resultado de la operación
ProgressTotalWork lectura Long Trabajo total en bytes
ProgressCompletedWork lectura Long Trabajo realizado en bytes
ProgressError lectura String Error del trabajo asíncrono
IsPaused lectura Boolean Operación pausada
FileCount lectura Int Número de archivos
DirectoryCount lectura Int Número de directorios
TotalUncompressedSize lectura Long Tamaño original total
TotalCompressedSize lectura Long Tamaño comprimido total
CompressionRatio lectura Double Comprimido / original × 100

Ejemplo:

Zip.SmartCompression = True
Zip.RunInThread = False

Log(Zip.FileCount)
Log(Zip.TotalCompressedSize)
Log(Zip.HasError)

LastError y HasError

Muchas operaciones capturan excepciones y las guardan:

If Zip.HasError Then
    Log(Zip.LastError)
End If

Para limpiar el estado:

Zip.ClearError

Añadir un archivo

La forma simple:

Zip.addFile(File.Combine(File.DirApp, "report.pdf"))

La forma configurable:

Dim Opt As Map = Zip.CreateOptions
Opt.Put("CompressionLevel", Zip.LEVEL_HIGHER)

Dim Ok As Boolean = Zip.AddFile2( _
    File.Combine(File.DirApp, "report.pdf"), _
    Opt)

If Ok = False Then
    Log(Zip.LastError)
End If

addFile llama internamente a AddFile2 con las opciones predeterminadas.


Añadir varios archivos

Dim Files As List
Files.Initialize
Files.Add(File.Combine(File.DirApp, "a.txt"))
Files.Add(File.Combine(File.DirApp, "b.txt"))
Files.Add(File.Combine(File.DirApp, "photo.jpg"))

Zip.addFiles(Files)

Con opciones:

Dim Opt As Map = Zip.CreateOptions
Opt.Put("CompressionLevel", Zip.LEVEL_ULTRA)

If Zip.AddFiles2(Files, Opt) = False Then
    Log(Zip.LastError)
End If

Nota sobre SmartCompression y AddFiles2

En la implementación actual, AddFiles2 crea un único ZipParameters para toda la lista. No evalúa ShouldStore archivo por archivo.

Por eso, si necesitas SmartCompression real para formatos mezclados, usa AddFile2 individualmente o comprime una carpeta mediante AddFolderSmart / AddFolder2 con Smart activo.


Añadir carpetas

Forma simple:

Zip.AddFolder(File.DirApp, "data")

Equivale a añadir:

File.Combine(File.DirApp, "data")

Con opciones

Dim Opt As Map = Zip.CreateOptions
Opt.Put("IncludeRootFolder", True)

Dim Ok As Boolean = Zip.AddFolder2( _
    File.Combine(File.DirApp, "data"), _
    Opt)

SmartCompression para una carpeta

Zip.SmartCompression = True

If Zip.AddFolderSmart(File.Combine(File.DirApp, "assets")) = False Then
    Log(Zip.LastError)
End If

En modo Smart, el wrapper recorre la carpeta, conserva las rutas relativas y decide el método de compresión por archivo.

Los directorios realmente vacíos también son agregados como entradas del ZIP.


SmartCompression

Actívalo globalmente:

Zip.SmartCompression = True

o mediante opciones:

Dim Opt As Map = Zip.CreateOptions
Opt.Put("Smart", True)

ShouldStore identifica como ya comprimidos estos formatos:

.zip .7z .rar .gz .jar
.png .jpg .jpeg .webp .gif
.mp3 .aac .ogg
.mp4 .mkv .webm
.woff .woff2

Para ellos usa STORE; para los demás usa DEFLATE.

Puedes consultar la decisión:

If Zip.ShouldStore("photo.jpg") Then
    Log("No conviene volver a comprimirlo")
End If

Smart folder + ejecución asíncrona

La implementación de carpeta Smart añade las entradas una por una.

Por ese motivo, para un flujo predecible es recomendable usar AddFolderSmart de forma síncrona. Si necesitas una sola operación de carpeta en segundo plano, usa el modo nativo de carpeta sin Smart.


Niveles de compresión

Constantes públicas:

Constante
LEVEL_NO_COMPRESSION
LEVEL_FASTEST
LEVEL_FASTER
LEVEL_FAST
LEVEL_MEDIUM_FAST
LEVEL_NORMAL
LEVEL_HIGHER
LEVEL_MAXIMUM
LEVEL_PRE_ULTRA
LEVEL_ULTRA

Ejemplo:

Dim Opt As Map = Zip.CreateOptions
Opt.Put("CompressionLevel", Zip.LEVEL_NORMAL)
Zip.AddFile2(File.Combine(File.DirApp, "database.db"), Opt)

CreateOptions usa LEVEL_ULTRA como nivel predeterminado.

Si el nombre del nivel no existe, CreateZipParameters intenta volver a ULTRA.


CreateOptions

Dim Opt As Map = Zip.CreateOptions

Valores predeterminados generados por el wrapper:

Clave Predeterminado
IncludeRootFolder False
CompressionLevel LEVEL_ULTRA
CompressionMethod DEFLATE
Smart valor actual de SmartCompression
OverrideExistingFilesInZip True
ReadHiddenFiles True
ReadHiddenFolders True

Puedes añadir otras opciones compatibles antes de llamar a AddFile2, AddFiles2, AddFolder2 o AddStream.


Opciones avanzadas admitidas

CreateZipParameters reconoce estas claves:

Clave Uso
CompressionMethod STORE o DEFLATE
CompressionLevel Una constante LEVEL_*
IncludeRootFolder Incluye la carpeta raíz
RootFolderNameInZip Nombre/ruta raíz dentro del ZIP
OverrideExistingFilesInZip Reemplaza entradas existentes
EncryptFiles Activa cifrado
EncryptionMethod AES o ZIP_STANDARD
AesKeyStrength Fuerza de clave AES
ReadHiddenFiles Incluye archivos ocultos
ReadHiddenFolders Incluye carpetas ocultas
SymbolicLinkAction Acción de enlaces simbólicos
UnixMode Modo Unix
LastModifiedFileTime Timestamp de la entrada
WriteExtendedLocalFileHeader Header local extendido
FileNameInZip Ruta/nombre exacto de la entrada
FileComment Comentario de la entrada

Para acceso aún más bajo nivel:

Dim NativeParams As JavaObject = Zip.CreateZipParameters(Opt)

Añadir un archivo dentro de una carpeta del ZIP

Zip.AddFileToFolder( _
    File.Combine(File.DirApp, "logo.png"), _
    "assets/images")

Varios archivos:

Zip.AddFilesToFolder(Files, "documents")

Una carpeta completa dentro de otra ruta:

Zip.AddFolderToFolder( _
    File.Combine(File.DirApp, "web"), _
    "backups/v1")

Añadir un InputStream

Para streams es recomendable usar AddStream2, porque obliga a definir el nombre de la entrada:

Dim In As InputStream = File.OpenInput(File.DirApp, "settings.json")

Dim Opt As Map = Zip.CreateOptions

If Zip.AddStream2(In, "config/settings.json", Opt) = False Then
    Log(Zip.LastError)
End If

In.Close

AddStream también es público, pero las opciones deben contener FileNameInZip:

Dim Opt As Map = Zip.CreateOptions
Opt.Put("FileNameInZip", "config/settings.json")
Zip.AddStream(In, Opt)

Cifrado AES

Ejemplo completo:

Dim Zip As ZipFile
Dim ZipPath As String = File.Combine(File.DirApp, "secure.zip")

Zip.InitializeWithPassword(ZipPath, "Secret123")

Dim Opt As Map = Zip.CreateOptions
Opt.Put("EncryptFiles", True)
Opt.Put("EncryptionMethod", "AES")
Opt.Put("AesKeyStrength", "KEY_STRENGTH_256")

If Zip.AddFile2(File.Combine(File.DirApp, "private.pdf"), Opt) = False Then
    Log(Zip.LastError)
End If

El valor KEY_STRENGTH_256 está utilizado por la propia implementación en saveZipCPassword.

ZIP Standard

Dim Opt As Map = Zip.CreateOptions
Opt.Put("EncryptFiles", True)
Opt.Put("EncryptionMethod", "ZIP_STANDARD")
Zip.AddFile2(File.Combine(File.DirApp, "private.txt"), Opt)

Si EncryptionMethod no es exactamente ZIP_STANDARD, el wrapper selecciona AES.


saveZipCPassword

Existe el helper heredado:

Zip.saveZipCPassword(ZipPath, Files, "Secret123")

Internamente crea otro ZipFile, usa AES y KEY_STRENGTH_256.

Para código nuevo es preferible usar explícitamente:

InitializeWithPassword
+ CreateOptions
+ EncryptFiles
+ AddFile2 / AddFiles2

porque así puedes comprobar directamente el Boolean de retorno y LastError.


Extraer todo

Zip.ExtractAll(File.Combine(File.DirApp, "extracted"))

Para un ZIP cifrado abierto con contraseña:

Dim Zip As ZipFile
Zip.InitializeWithPassword( _
    File.Combine(File.DirApp, "secure.zip"), _
    "Secret123")

Zip.ExtractAll(File.Combine(File.DirApp, "output"))

If Zip.HasError Then
    Log(Zip.LastError)
End If

También existe:

Zip.ExtractZipWithPassword( _
    File.Combine(File.DirApp, "secure.zip"), _
    File.Combine(File.DirApp, "output"), _
    "Secret123")

Extraer una sola entrada

Zip.ExtractFile( _
    "docs/manual.pdf", _
    File.Combine(File.DirApp, "output"))

El nombre debe coincidir con la ruta interna de la entrada.


Leer un archivo sin extraerlo

Texto

Dim JsonText As String = Zip.ReadText( _
    "config/settings.json", _
    "UTF-8")

If Zip.HasError Then
    Log(Zip.LastError)
Else
    Log(JsonText)
End If

Si el Charset está vacío, ReadText usa UTF-8.

Bytes

Dim Data() As Byte = Zip.ReadBytes("images/logo.png")
Log(Data.Length)

ReadBytes carga la entrada completa en memoria. Para archivos grandes usa GetInputStream.


Leer mediante InputStream

Primero busca el header:

Dim Header As ZipFileHeader = Zip.getFileName("video/data.bin")

If Header <> Null Then
    Dim In As InputStream = Zip.GetInputStream(Header)

    ' Procesar el stream...
    In.Close
End If

getFileName(filename) permanece documentado como método porque recibe un parámetro; no es una propiedad B4X.


Listar el contenido del ZIP

La propiedad FileNames tiene un nombre histórico: no devuelve Strings. Devuelve una lista de ZipFileHeader.

For Each Header As ZipFileHeader In Zip.FileNames
    Log(Header.FileName)
Next

Ejemplo completo:

For Each Header As ZipFileHeader In Zip.FileNames
    Log("Name: " & Header.FileName)
    Log("Directory: " & Header.IsDirectory)
    Log("Encrypted: " & Header.IsEncrypted)
    Log("Method: " & Header.CompressionMethod)
    Log("Original: " & Header.UncompressedSize)
    Log("Compressed: " & Header.CompressedSize)
Next

Si necesitas los objetos nativos de Zip4j:

Dim NativeHeaders As List = Zip.FileHeaders

ZipFileHeader envuelve un net.lingala.zip4j.model.FileHeader.

Normalmente no necesitas crearlo manualmente: lo obtienes desde Zip.FileNames o Zip.getFileName(...).

Propiedades de ZipFileHeader

Propiedad Acceso Tipo Descripción
Obj lectura / escritura Object FileHeader nativo
FileName lectura / escritura String Ruta interna de la entrada
LastModifiedTime lectura Long Epoch milliseconds
UncompressedSize lectura Long Tamaño original
CompressedSize lectura Long Tamaño comprimido
Crc lectura Long CRC-32
IsDirectory lectura Boolean Es directorio
CompressionMethod lectura String DEFLATE, STORE, etc.
IsEncrypted lectura Boolean Entrada cifrada
FileComment lectura String Comentario de la entrada
OffsetLocalHeader lectura Long Offset del header local

FileName no renombra el ZIP

Esto:

Header.FileName = "new-name.txt"

solo modifica el objeto header en memoria.

Para renombrar realmente la entrada almacenada:

Zip.RenameFile("old-name.txt", "new-name.txt")

Renombrar entradas

Una entrada:

Zip.RenameFile( _
    "docs/old.txt", _
    "docs/new.txt")

Varias entradas:

Dim RenameMap As Map
RenameMap.Initialize
RenameMap.Put("a.txt", "archive/a.txt")
RenameMap.Put("b.txt", "archive/b.txt")

Zip.RenameFiles(RenameMap)

Eliminar entradas

Una:

Zip.RemoveFile("old.log")

Varias:

Dim RemoveList As List
RemoveList.Initialize2(Array As String( _
    "temp/a.tmp", _
    "temp/b.tmp"))

Zip.RemoveFiles(RemoveList)

Comentario del ZIP

Como getComment/setComment forman un accesor B4X válido, se usa como propiedad:

Zip.Comment = "Backup generated by my B4J app"
Log(Zip.Comment)

Charset

Configura el charset usado por Zip4j para nombres y comentarios:

Zip.SetCharset("UTF-8")
Log(Zip.GetCharset)

Otros nombres aceptados dependen de los charsets disponibles en Java, por ejemplo CP437 o Windows-1252.

SetCharset y GetCharset comienzan con mayúscula, por lo que se documentan como métodos normales, no como propiedad B4X.


Validar un ZIP

If Zip.ValidateArchive Then
    Log("ZIP válido")
Else
    Log("ZIP no válido: " & Zip.LastError)
End If

Alias público:

If Zip.IsValidZipFile Then
    Log("ZIP válido")
End If

ZIP cifrado

If Zip.IsEncrypted Then
    Log("El archivo requiere contraseña")
End If

ZIP dividido / multipart

Detectar:

If Zip.IsSplitArchive Then
    Log("Es un ZIP dividido")
End If

Fusionar:

Zip.MergeSplitFiles( _
    File.Combine(File.DirApp, "merged.zip"))

El wrapper actual permite detectar y fusionar split ZIP. No expone un método público específico para crear un ZIP dividido.

Aunque GetCapabilities devuelve SplitZip = True, en esta API pública esa capacidad se refiere al manejo de archivos divididos existente, especialmente detección y merge.


Ejecución en segundo plano

Zip.RunInThread = True

Dim Opt As Map = Zip.CreateOptions
Zip.AddFolder2(File.Combine(File.DirApp, "large-folder"), Opt)

Después puedes consultar el monitor periódicamente.

Ejemplo con Timer

Sub Class_Globals
    Private Zip As ZipFile
    Private ProgressTimer As Timer
End Sub

Private Sub StartBackup
    Zip.Initialize(File.Combine(File.DirApp, "backup.zip"))
    Zip.RunInThread = True
    Zip.SmartCompression = False

    ProgressTimer.Initialize("ProgressTimer", 200)
    ProgressTimer.Enabled = True

    Dim Opt As Map = Zip.CreateOptions
    Zip.AddFolder2(File.Combine(File.DirApp, "data"), Opt)
End Sub

Private Sub ProgressTimer_Tick
    Log("Task: " & Zip.ProgressTask)
    Log("File: " & Zip.ProgressFile)
    Log("Progress: " & Zip.ProgressPercent & "%")

    If Zip.IsBusy = False Then
        ProgressTimer.Enabled = False

        Log("Result: " & Zip.ProgressResult)

        If Zip.ProgressError <> "" Then
            Log("Error: " & Zip.ProgressError)
        End If
    End If
End Sub

En modo asíncrono, un Boolean devuelto inmediatamente por una función significa que la llamada pudo iniciarse; el resultado final de la tarea debe consultarse mediante ProgressResult y ProgressError.


Pausar, continuar y cancelar

Zip.Pause
Log(Zip.IsPaused)

Zip.Resume

Zip.Cancel

Estas operaciones actúan sobre el ProgressMonitor nativo.


Estados de progreso

Propiedades disponibles:

Log(Zip.IsBusy)
Log(Zip.ProgressPercent)
Log(Zip.ProgressFile)
Log(Zip.ProgressTask)
Log(Zip.ProgressState)
Log(Zip.ProgressResult)
Log(Zip.ProgressTotalWork)
Log(Zip.ProgressCompletedWork)
Log(Zip.ProgressError)

La implementación espera valores como:

ProgressState:
READY
BUSY

ProgressResult:
SUCCESS
WORK_IN_PROGRESS
ERROR
CANCELLED

ProgressTask devuelve el nombre de la tarea nativa, por ejemplo ADD, EXTRACT o MERGE_ZIP_FILES según la operación.


Estadísticas del archivo

Log("Files: " & Zip.FileCount)
Log("Folders: " & Zip.DirectoryCount)
Log("Original bytes: " & Zip.TotalUncompressedSize)
Log("ZIP bytes: " & Zip.TotalCompressedSize)
Log("Ratio: " & Zip.CompressionRatio & "%")

Cómo interpretar CompressionRatio

La fórmula implementada es:

TotalCompressedSize * 100 / TotalUncompressedSize

Por tanto:

  • 100% ≈ sin reducción.
  • 50% = el ZIP ocupa aproximadamente la mitad.
  • 25% = el ZIP ocupa aproximadamente una cuarta parte.

Si quieres calcular el porcentaje ahorrado:

Dim SavedPercent As Double = 100 - Zip.CompressionRatio

Capacidades declaradas

Dim Caps As Map = Zip.GetCapabilities

For Each Key As String In Caps.Keys
    Log(Key & ": " & Caps.Get(Key))
Next

El wrapper declara:

Streams
AsyncProgress
Pause
Cancel
AES
ZipStandard
SplitZip
RenameMultiple
RemoveMultiple
SymbolicLinks
Charset
Zip64
SmartCompression

Acceso nativo a Zip4j

Para funciones avanzadas no envueltas:

Dim NativeZip As JavaObject = Zip.Obj

También existe el alias de lectura Obj2.

Utiliza el acceso nativo solo cuando necesites una función no cubierta por la API B4J, porque ya dependes directamente de las firmas de Zip4j.


Cerrar el archivo

Zip.Close

Libera los handles abiertos por el objeto Zip4j.


Ejemplo completo: backup inteligente y cifrado

Sub CreateSecureBackup
    Dim Zip As ZipFile

    Dim OutputZip As String = File.Combine(File.DirApp, "backup-secure.zip")
    Dim SourceFolder As String = File.Combine(File.DirApp, "data")

    Zip.InitializeWithPassword(OutputZip, "Secret123")
    Zip.SmartCompression = True

    Dim Opt As Map = Zip.CreateOptions
    Opt.Put("IncludeRootFolder", True)
    Opt.Put("CompressionLevel", Zip.LEVEL_ULTRA)
    Opt.Put("EncryptFiles", True)
    Opt.Put("EncryptionMethod", "AES")
    Opt.Put("AesKeyStrength", "KEY_STRENGTH_256")

    If Zip.AddFolder2(SourceFolder, Opt) = False Then
        Log("ZIP error: " & Zip.LastError)
        Return
    End If

    Zip.Comment = "Encrypted application backup"

    Log("Files: " & Zip.FileCount)
    Log("Compressed: " & Zip.TotalCompressedSize)
    Log("Original: " & Zip.TotalUncompressedSize)
    Log("Size ratio: " & NumberFormat(Zip.CompressionRatio, 1, 2) & "%")

    Zip.Close
End Sub

API pública de ZipFile

Inicialización y configuración

Initialize, InitializeWithPassword, SetPassword, SetCharset, GetCharset, Close, ClearError, ShouldStore, CreateOptions, CreateZipParameters.

Añadir contenido

addFile, AddFile2, addFiles, AddFiles2, AddFolder, AddFolderWithParameters, AddFolder2, AddFolderSmart, AddFileToFolder, AddFilesToFolder, AddFolderToFolder, AddStream, AddStream2.

Extracción y lectura

ExtractAll, ExtractFile, ExtractZipWithPassword, GetInputStream, ReadText, ReadBytes.

Cifrado

InitializeWithPassword, SetPassword, saveZipCPassword.

Modificar el ZIP

RemoveFile, RemoveFiles, RenameFile, RenameFiles.

Inspección

getFileName(filename), IsEncrypted, IsSplitArchive, ValidateArchive, IsValidZipFile, MergeSplitFiles, GetCapabilities.

Control asíncrono

Cancel, Pause, Resume.

Las demás funciones getX/setX compatibles aparecen en la documentación como propiedades B4X.


API pública de ZipFileHeader

Métodos normales:

Initialize, isDirectory.

Las funciones getX/setX compatibles se presentan como propiedades:

Obj, FileName, LastModifiedTime, UncompressedSize, CompressedSize, Crc, IsDirectory, CompressionMethod, IsEncrypted, FileComment, OffsetLocalHeader.


Buenas prácticas

  • Usa AddFile2, AddFolder2 y AddStream2 cuando necesites control y manejo de errores.
  • Comprueba LastError / HasError después de operaciones que no devuelven Boolean.
  • Para archivos grandes dentro del ZIP, usa GetInputStream en lugar de ReadBytes.
  • Para cifrado nuevo, prefiere el flujo explícito con InitializeWithPassword y opciones AES.
  • Usa ZipFileHeader para inspeccionar entradas; no cambies Header.FileName esperando renombrar el archivo almacenado.
  • Para carpetas Smart, usa modo síncrono si quieres la selección STORE/DEFLATE por archivo.
  • Cierra el objeto con Close cuando hayas terminado.

Utilidades relacionadas del sistema de archivos

La familia Archivos y compresión también incluye:

  • FileUtils — copia/eliminación recursiva de carpetas, CopyAsync, renombrado, listado de subcarpetas y fechas de archivo.
  • FileChooserUtils — filtros de extensión para JavaFX FileChooser, filtro combinado, All Files y selección del filtro predeterminado.

Un flujo práctico de backup puede usar FileChooserUtils → FileUtils → ZipFile: elegir el destino, preparar los archivos, crear el ZIP, validarlo y finalmente eliminar los datos temporales.