Archivos y compresión · jdashboardUI · B4J · StaticCode
FileUtils es un módulo estático para tareas del sistema de archivos. Complementa a ZipFile: usa FileUtils para preparar, copiar, limpiar o inspeccionar carpetas y ZipFile cuando el resultado final debe ser un archivo comprimido.
Qué permite hacer
- Crear las carpetas padre que falten para una ruta de archivo.
- Copiar un archivo o un árbol completo de carpetas de forma recursiva.
- Ejecutar la copia recursiva mediante un
ResumableSub. - Eliminar archivos o carpetas completas recursivamente.
- Renombrar un archivo.
- Obtener todas las subcarpetas descendientes de una carpeta raíz.
- Leer y modificar la fecha de creación.
- Modificar la fecha de última modificación.
API pública
| Método | Uso |
|---|---|
createNonExistingDir(path) |
Crea las carpetas padre que falten |
Copy(...) |
Copia un archivo o carpeta completa |
CopyAsync(...) |
Versión ResumableSub de la copia recursiva |
Delete(...) |
Elimina un archivo o árbol de carpetas |
RenameTo(...) |
Renombra un archivo |
GetSubFolders(...) |
Obtiene todas las subcarpetas |
SetModifiedTime(...) |
Cambia la fecha de modificación |
GetFileCreation(...) |
Lee la fecha de creación |
SetFileCreation(...) |
Cambia la fecha de creación |
Crear carpetas padre inexistentes
createNonExistingDir espera normalmente una ruta que incluya el nombre final del archivo. Internamente usa File.GetFileParent(path) y crea las carpetas padre que no existan.
Dim TargetFile As String = File.Combine(File.DirApp, "exports/2026/october/report.pdf")
FileUtils.createNonExistingDir(TargetFile)
Si ya tienes directamente la ruta de una carpeta, File.MakeDir puede ser más apropiado.
Copia recursiva
A diferencia de File.Copy, FileUtils.Copy también trabaja con directorios.
FileUtils.Copy( _
File.DirApp, "data", _
File.Combine(File.DirApp, "backup"), "data")
Cuando el elemento de origen es una carpeta, el módulo crea la carpeta de destino y copia recursivamente su contenido.
Copia recursiva asíncrona
CopyAsync devuelve un ResumableSub. Usa Wait For para obtener el Boolean final.
Private Sub CopyProject As ResumableSub
Dim BackupRoot As String = File.Combine(File.DirApp, "backup")
Wait For (FileUtils.CopyAsync( _
File.DirApp, "data", _
BackupRoot, "data")) Complete (Success As Boolean)
If Success Then
Log("Copia terminada")
Else
Log("La copia falló")
End If
Return Success
End Sub
En operaciones críticas de backup también es recomendable comprobar que el destino esperado existe al finalizar.
Eliminación recursiva
FileUtils.Delete(File.DirApp, "temporary-backup")
El método entra en las carpetas y elimina primero su contenido. Es una operación destructiva, por lo que conviene revisar la ruta antes de ejecutarla.
Renombrar un archivo
FileUtils.RenameTo(File.DirApp, "backup.tmp", "backup.zip")
La implementación actual envuelve java.io.File.renameTo. No expone el Boolean que devuelve Java; si necesitas confirmar el resultado, verifica que exista el destino.
Obtener todas las subcarpetas
GetSubFolders recorre la raíz de forma recursiva y devuelve las rutas completas de todas las carpetas descendientes. La carpeta raíz no se incluye.
Dim Folders As List = FileUtils.GetSubFolders(File.Combine(File.DirApp, "projects"))
For Each FolderPath As String In Folders
Log(FolderPath)
Next
Fechas de archivo
FileUtils.SetModifiedTime(File.DirApp, "report.pdf", DateTime.Now)
Dim Created As Long = FileUtils.GetFileCreation(File.DirApp, "report.pdf")
Log(DateTime.Date(Created) & " " & DateTime.Time(Created))
FileUtils.SetFileCreation(File.DirApp, "report.pdf", DateTime.Now)
Las operaciones sobre la fecha de creación utilizan atributos Java NIO. Su soporte final depende del sistema operativo y del sistema de archivos.
Flujo recomendado de backup con ZipFile
Una buena práctica es mantener los archivos temporales del backup fuera de la carpeta que se está comprimiendo. Así evitas incluir accidentalmente ZIP intermedios dentro de otro ZIP.
Private Sub CreateApplicationBackup As ResumableSub
Dim StageParent As String = File.Combine(File.DirApp, "work")
Dim StageName As String = "backup-stage"
If File.Exists(StageParent, StageName) Then
FileUtils.Delete(StageParent, StageName)
End If
File.MakeDir(StageParent, StageName)
Dim StageDir As String = File.Combine(StageParent, StageName)
Wait For (FileUtils.CopyAsync( _
File.DirApp, "data", _
StageDir, "data")) Complete (Copied As Boolean)
If Copied = False Then Return False
Dim Zip As ZipFile
Zip.Initialize(File.Combine(File.DirApp, "backup.zip"))
Zip.SmartCompression = True
If Zip.AddFolderSmart(StageDir) = False Then
Log(Zip.LastError)
FileUtils.Delete(StageParent, StageName)
Return False
End If
If Zip.ValidateArchive = False Then
Log("ZIP inválido: " & Zip.LastError)
FileUtils.Delete(StageParent, StageName)
Return False
End If
FileUtils.Delete(StageParent, StageName)
Return True
End Sub
Aquí FileUtils prepara y limpia las carpetas de trabajo, mientras ZipFile crea y valida el archivo.
Módulos relacionados de jdashboardUI
- FileChooserUtils — filtros de extensión y selección predeterminada para JavaFX
FileChooser. - ZipFile + ZipFileHeader — creación, cifrado, lectura, modificación, validación e inspección de ZIP.
Buenas prácticas
- Usa
Wait ForconCopyAsync. - Revisa muy bien las rutas antes de una eliminación recursiva.
- Mantén las carpetas temporales fuera de los datos que estás comprimiendo.
- Verifica el destino después de
RenameTocuando el resultado sea crítico. - Considera que la fecha de creación depende del sistema de archivos.