Technical Support
🟢 Online now
Hello 👋

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

FileUtils

Utilidades estáticas para copia/eliminación recursiva, carpetas, renombrado y fechas de archivo

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

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 For con CopyAsync.
  • 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 RenameTo cuando el resultado sea crítico.
  • Considera que la fecha de creación depende del sistema de archivos.