Manejo de Archivos y Directorios en wxWidgets

347 palabras 2 minutos C++ wxWidgets Linux

En el artículo anterior vimos cómo trabajar con rutas de forma portable utilizando wxStandardPaths y wxFileName. Ahora vamos un paso más allá y veremos cómo crear, copiar, mover, eliminar y recorrer archivos y directorios utilizando las clases que wxWidgets pone a nuestra disposición.

Estas herramientas permiten escribir aplicaciones multiplataforma sin necesidad de recurrir a APIs específicas de Windows o Linux.


wxFileName: Mucho Más que una Ruta

Aunque suele utilizarse para construir rutas, wxFileName también permite manipular archivos y directorios.

Crear un objeto archivo

wxFileName file(
    "/home/usuario",
    "config.ini"
);

O utilizando una ruta completa:

wxFileName file(
    "/home/usuario/config.ini"
);

Obtener Componentes

Nombre del archivo

wxString name = file.GetName();

Resultado:

config

Extensión

wxString ext = file.GetExt();

Resultado:

ini

Ruta

wxString path = file.GetPath();

Resultado:

/home/usuario

Ruta completa

wxString full = file.GetFullPath();

Resultado:

/home/usuario/config.ini

Verificar Existencia

Archivo

if (file.FileExists())
{
    // existe
}

Directorio

if (file.DirExists())
{
    // existe
}

Crear Directorios

wxFileName::Mkdir(
    "backups/2026",
    wxS_DIR_DEFAULT,
    wxPATH_MKDIR_FULL
);

Si no existen los directorios intermedios serán creados automáticamente.


Eliminar Directorios

wxFileName::Rmdir(
    "temp"
);

Eliminar de forma recursiva:

wxFileName::Rmdir(
    "temp",
    wxPATH_RMDIR_RECURSIVE
);

wxFile: Lectura y Escritura de Archivos

La clase wxFile es una alternativa simple y eficiente para operaciones binarias o de texto.


Crear un Archivo

wxFile file(
    "log.txt",
    wxFile::write
);

Escribir Texto

file.Write(
    "Sigma Contable iniciado\n"
);

Cerrar Archivo

file.Close();

Aunque el destructor suele encargarse automáticamente.


Leer un Archivo Completo

wxFile file("config.ini");

wxString contenido;

file.ReadAll(&contenido);

Verificar Apertura

if (!file.IsOpened())
{
    wxLogError(
        "No se pudo abrir el archivo"
    );
}

Copiar Archivos

Con wxCopyFile():

wxCopyFile(
    "sigma.db",
    "backup/sigma.db",
    true
);

El último parámetro indica si debe sobrescribir archivos existentes.


Mover o Renombrar Archivos

wxRenameFile(
    "viejo.txt",
    "nuevo.txt"
);

Eliminar Archivos

wxRemoveFile(
    "temporal.tmp"
);

wxDir: Recorrer Directorios

Cuando necesitamos listar archivos, wxDir es la herramienta adecuada.


Abrir un Directorio

wxDir dir("backups");

if (!dir.IsOpened())
{
    return;
}

Recorrer Archivos

wxString filename;

bool cont =
    dir.GetFirst(
        &filename,
        "*.bak",
        wxDIR_FILES
    );

while (cont)
{
    wxLogMessage(filename);

    cont = dir.GetNext(
        &filename
    );
}

Recorrer Subdirectorios

wxString dirname;

bool cont =
    dir.GetFirst(
        &dirname,
        "",
        wxDIR_DIRS
    );

while (cont)
{
    wxLogMessage(dirname);

    cont = dir.GetNext(
        &dirname
    );
}

Contar Archivos

wxDir dir("documentos");

wxString name;

int cantidad = 0;

bool cont =
    dir.GetFirst(
        &name
    );

while (cont)
{
    cantidad++;

    cont = dir.GetNext(
        &name
    );
}

Ejemplo: Crear un Backup Automático

Supongamos que Sigma Contable desea generar un backup de la base de datos cada vez que se cierra la aplicación.

wxString origen =
    "sigma.db";

wxString destino =
    "backups/sigma.db";

wxFileName::Mkdir(
    "backups",
    wxS_DIR_DEFAULT,
    wxPATH_MKDIR_FULL
);

wxCopyFile(
    origen,
    destino,
    true
);

Versión con fecha:

wxDateTime now =
    wxDateTime::Now();

wxString backup =
    wxString::Format(
        "backups/sigma_%s.db",
        now.Format("%Y%m%d_%H%M%S")
    );

wxCopyFile(
    "sigma.db",
    backup,
    true
);

Cada backup tendrá un nombre único.


¿Cuándo Usar Cada Clase?

ClaseUso Principal
wxFileNameManipular rutas y nombres
wxFileLeer y escribir archivos
wxDirRecorrer directorios
wxStandardPathsObtener ubicaciones estándar
wxTextFileArchivos de texto línea por línea
wxFFileInterfaz estilo C (FILE*)

Conclusión

wxWidgets ofrece prácticamente todo lo necesario para trabajar con archivos y directorios de forma portable.

Las clases más utilizadas en aplicaciones de escritorio suelen ser:

  • wxFileName
  • wxFile
  • wxDir
  • wxStandardPaths

Combinadas permiten implementar configuraciones, bases de datos, backups, logs y exportaciones sin escribir código específico para Windows o Linux.

Si estás desarrollando una aplicación como Sigma Contable, dominar estas clases te permitirá mantener un único código fuente y olvidarte de las diferencias entre sistemas operativos.