Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

miércoles, 1 de abril de 2015

Truco: Como Guardar (y Abrir) comprimidos los archivos de datos de nuestros programas

En este artículo, os comento como guardar datos de nuestros programas y luego abrirlos, comprimiendo los archivos. Aunque lo explico usando código de Gambas, es aplicable a otros lenguajes Python, Java, etc... Básicamente se trata de usar el comando del sistema tar,  y para que se entienda mejor, os haré la explicación de como lo hace el programa pintascreen.

El programa pintascreen, maneja los siguientes datos:
- Una imagen de fondo
- Un array de objetos del tipo "dibujo", que es el que contiene las diversas primitivas de dibujo, osea los objetos del tipo "marcador", "texto", "linea", "flecha", "chincheta", etc... que es lo que va dibujando el usuario.
- Una imagen miniatura de todo lo que ha dibujado, que la usa para mostrarla en el formulario de "abrir":

Os describo los pasos a seguir para Guardar los datos:

Los archivos que tenemos que guardar por cada captura son:
fondo.jpg: es la imagen del fondo
mini.jpg: es una imagen en miniatura de lo dibujado (incluyendo el fondo)
figuras.txt: es un archivo de texto plano, donde se guardan los datos de las figuras dibujadas (ancho, color, coordenada de inicio y fin, etc..)

Pasos a seguir:
0) Pedir la ruta y el nombre del archivo donde guardaremos los datos. Lo guardaremos en la variable "rutafichero"

1)  Generar los archivos, tanto la imagen de miniatura como el archivo .txt de las figuras dibujadas.
No entro en detalles, porque para cada programa será distinto, pero podeis ver como se hace en el pintascreen en el módulo: ModuleAbrirGuardar, en el método guardar().


2) Copiarlos en una ruta.
En nuestro caso, los vamos a copiarlo en el directorio /tmp/pintascreenGuarda/

3) Crear el tar.gz
Mediante el siguiente comando, vamos a crear el archivo comprimido que contenga los 3archivos:

comando = "cd /tmp/pintascreenGuarda/;tar czvf \"" & File.Name(rutafichero) & ".tar.gz\" *"

Nota:Es muy importante que usemos "cd" para desplazarnos al directorio donde tenemos los archivos, y luego usar ";" para unir la siguiente orden (tar).

y lo ejecutamos con la orden Shell:

Shell comando Wait

4) Cambiamos la extensión .tar.gz por .pintascreen y lo movemos a la ruta seleccionada:

comando = "mv /tmp/pintascreenGuarda/" & File.Name(rutafichero) & ".tar.gz " & Rutafichero &".pintascreen"
Shell comando Wait

5) Borrar archivos temporales.
Borraríamos los archivos que tendríamos en la carpeta "/tmp/pintascreenGuarda/":

 For Each nombrearchivo In Dir("/tmp/pintascreenGuarda/", "*.*", GB.File).Sort()
Kill "/tmp/pintascreenGuarda/" & nombrearchivo
Next

Así obtenemos un archivo con extensión .pintascreen, que realmente es un tar.gz, con losarchivos de los datos comprimidos y empaquetado.


Pasos para Abrir los archivos .pintascreen
0)  Elegir el archivo que queremos abrir, lo llamaremos "rutafichero"

1) Creamos el directorio de trabajo, en nuestro caso lo llamamos "/tmp/pintascreenAbrir", y si no existe lo creamos:
If Not Exist("/tmp/pintascreenAbrir") Then
Mkdir "/tmp/pintascreenAbrir"
Endif

2) Borramos el contenido del directorio de trabajo, por si hubiésemos abierto otro archivoanteriormente.

'borrar archivos existentes
For Each nombrearchivo In Dir("/tmp/pintascreenAbrir", "*.*", GB.File).Sort()
Kill "/tmp/pintascreenAbrir/" & nombrearchivo
Next

3) Copiamos el archivo y lo descomprimirmos.

'copia el archivo y lo descomprime el archivo
Copy Rutafichero To "/tmp/pintascreenAbrir/" & File.Name(Rutafichero)
Shell "cd /tmp/pintascreenAbrir/;tar -zxvf \"/tmp/pintascreenAbrir/" & File.Name(Rutafichero) & "\"" Wait

Nota:
Es muy importante que usemos "cd" para desplazarnos al directorio donde tenemos los archivos, y luego usar ";" para unir la siguiente orden (tar).

4) Ya con los archivos descomprimidos, lo usaríamos en el programa, por ejemplo en el pintascreen, se cargaría el fondo, se leería el fichero de figuras.txt, para crear los objetos de dibujo.



Extracción de un archivo concreto:
Os dejo por ultimo, la forma de extraer un archivo en concreto, que es lo que uso para cuando estamos en el formulario de abrir, y nos muestra la miniatura. Se trata de usar el comando tag -zxvf indicándole la ruta donde queramos que se descomprima y el nombre del fichero que queramos extraer. Esto lo hago con el método "cargaImagen()", que esta en el módulo "ModuleAbrirGuardar"
Public Sub cargaImagen(Rutafichero As String) As Picture
'leer el archivo, lo descomprime, y carga la vista minuatura...Try Kill "/tmp/mini.jpg"
Shell "cd /tmp;tar -zxvf \"" & Rutafichero & "\" mini.jpg"Wait
If Exist("/tmp/mini.jpg") ThenReturnPicture.Load("/tmp/mini.jpg")ElseReturn NullEndif
End

Como veis, la función recibe el nombre (ruta incluida), del fichero que queremos ver si miniatura, y devuelve un objeto Picture.
Extrae el fichero mini.jpg (en la ruta /tmp) ,
Shell "cd /tmp;tar -zxvf \"" & Rutafichero & "\" mini.jpg" Wait

 y lo carga y devuelve
Return Picture.Load("/tmp/mini.jpg")

Si hay no lo encuentra, devuelve Null
Return Null

Por último os comento que seguramente existen otros métodos más óptimos y con mejor rendimiento para hacer esto, yo os lo comento para que veais la forma en que lo hago yo, y como lo he usado en varios de mis programas con éxito.

Nota:
El código fuente del programa pintascreen lo podéis descargar en:

No hay comentarios:

Publicar un comentario en la entrada

A falta de donativos... un poco de publicidad