Manejo de Archivos y Directorios en wxWidgets
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?
| Clase | Uso Principal |
|---|---|
wxFileName | Manipular rutas y nombres |
wxFile | Leer y escribir archivos |
wxDir | Recorrer directorios |
wxStandardPaths | Obtener ubicaciones estándar |
wxTextFile | Archivos de texto línea por línea |
wxFFile | Interfaz 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:
wxFileNamewxFilewxDirwxStandardPaths
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.