close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 15 years ago

Closed 14 years ago

Last modified 14 years ago

#922 closed task (fixed)

Utilidades TOL de compresión y archivado de ficheros y directorios

Reported by: Víctor de Buen Remiro Owned by: Víctor de Buen Remiro
Priority: highest Milestone: TOL Extensions
Component: System Version: head
Severity: blocker Keywords:
Cc:

Description (last modified by Víctor de Buen Remiro)

Es cada vez más necesario tener un mecanismo de compresión y archivado de ficheros y directorios que permitan leer y escribir directamente desde TOL archivos .zip, .7z, .gz, .tgz, tar, ...

Cada tipo de archivo tiene un motor y una SDK completamente distinto y podría ser muy lioso crear funciones built-in en TOL para el manejo de cada uno de ellos.

Lo más cómodo de utilizar para un usuario sería una jerarquía de clases con una clase básica abstracta con los métodos comunes que en un principio podrían ser estos

Class @Store
{
  //Identificador del motor de compresión 
  Text _.engine;
  //Extensión por defecto para los archivos
  Text _.ext;
  //Ubicación física del archivo en el disco local
  Text _.path = "";
  //Indica si el archivo está correctamente abierto
  Real _.isOpen = False;
  //Abre el archivo para lectura o escritura
  Real Open(Text path, Text readOrWrite);
  //Cierra el archivo
  Real Close(Real void);
  //Añade un fichero al archivo
  Real File.Add(Set originalFilePath);
  //Extrae un fichero del archivo
  Real File.Extract(Text originalFilePath, Text destinationDirPath);
  //Determina si existe o no un fichero dentro del archivo
  Real File.Exists(Text originalFilePath)
  //Añade un directorio completo recursivamente
  Real Dir.Add(Text originalDirPath);
  //Extrae un directorio completo recursivamente
  Real Dir.Extract(Text originalDirPat, Text destinationDirPath);
  //Determina si existe o no un directorio dentro del archivo
  Real Dir.Exists(Text originalFilePath);

  Real __destroy (Real void)  
  {
    If(_.isOpen, Close(void))
  }

};

El destructor se encargaría de cerrar el archivo si no lo ha hecho el usuario previamente. Luego se podrían añadir otros métodos conforme se hicieran necesarios. De esta clase básica se podría luego heredar una clase para cada motor que se quiera manejar:

Class @ZipArchive: @Store 
{ 
  Text _.engine = "ZLib";
  Text _.engine = ".zip";
  ... 
};
Class @SevenZip: @Store { ... };
{ 
  Text _.engine = "LZMA";
  Text _.ext = ".7z";
  ... 
};
Class @Rar: @Store { ... };
{ 
  Text _.engine = "Rar";
  Text _.ext = ".rar";
  ... 
};
Class @Tar: @Store { ... };
{ 
  Text _.engine = "Tar";
  Text _.ext = ".tar";
  ... 
};

Toda esta jerarquía de clases sería conveniente distribuirla como un paquete oficial que podría llamarse PackArchive. Cada na de ellas podría añadir miembros opcionales de configuración pero siempre con valores por defecto. Finalmente se podría hacer un método constructor que creara una instancia con la clase adecuada al motor de forma que el usuario no tuviera que conocer los intríngulis para hacer las tareas normales, sino que le bastara con entender la API de la clase base PackArchive::@Store

@Store Create(Text engine, Text path, Text readOrWrite)

Evidentemente haría falta implementar alguna función TOL built-in en C++ que facultara la conexión con los distintos SDK, pero ya no haría falta más que una función para cada método que tomara como primer argumento la propia instancia de clase.

  //Abre el archivo para lectura o escritura
  Real PackArchive.Open(NameBlock archive, Text path, Text readOrWrite);
  //Cierra el archivo
  Real PackArchive.Close(NameBlock archive);
  //Añade un fichero al archivo
  Real PackArchive.File.Add(NameBlock archive, Set originalFilePath);
  //Extrae un fichero del archivo
  Real PackArchive.File.Extract(NameBlock archive, Text originalFilePath, Text destinationDirPath);
  //Determina si existe o no un fichero dentro del archivo
  Real PackArchive.File.Exists(NameBlock archive, Text originalFilePath)
  //Añade un directorio completo recursivamente
  Real PackArchive.Dir.Add(NameBlock archive, Text originalDirPath);
  //Extrae un directorio completo recursivamente
  Real PackArchive.Dir.Extract(NameBlock archive, Text originalDirPat, Text destinationDirPath);
  //Determina si existe o no un directorio dentro del archivo
  Real PackArchive.Dir.Exists(NameBlock archive, Text originalFilePath)

Lo ideal sería que estas funciones se crearan como una DLL aparte de TOL que se cargara dinámicamente y de forma local, para que fuera un paquete completamente opcional. Si no es posible esto, de momento se puede enlazar internamente con tol.dll y distribuirse el paquete como parte de la StdLib.

Change History (18)

comment:1 Changed 15 years ago by Víctor de Buen Remiro

Description: modified (diff)

comment:2 Changed 15 years ago by Víctor de Buen Remiro

Component: ASCII data filesSystem
Milestone: TOL Extensions
Type: defecttask
Version: head

comment:3 Changed 15 years ago by Víctor de Buen Remiro

Description: modified (diff)
Status: newaccepted

comment:4 Changed 15 years ago by Víctor de Buen Remiro

(In [2304]) Refs #922
Funciones built-in de PackArchive
Por el momento se implemeta sólo el motor de ZipArchive

comment:5 Changed 15 years ago by Víctor de Buen Remiro

(In [2305]) Refs #922
NameBlock PackArchive para el archivado y compresión de ficheros

comment:6 Changed 15 years ago by Víctor de Buen Remiro

(In [2320]) Refs #922
Fixes syntax an logical errors

comment:7 Changed 15 years ago by Víctor de Buen Remiro

(In [2321]) Refs #922
Fixes syntax an logical errors

comment:8 Changed 15 years ago by Víctor de Buen Remiro

(In [2324]) Refs #922
Adds PackArchive to project

comment:9 Changed 15 years ago by Víctor de Buen Remiro

(In [2340]) Refs #922
Adds PackArchive to project

comment:10 Changed 15 years ago by Jorge

(In [2352]) refs #922 : including PackgArchive directory in Jamroot

comment:11 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: acceptedclosed

(In [2580]) Fixes #922

comment:12 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: closedreopened

Ha habido un error en el commit.
En realidad era
(In [2580]) Fixes #992

comment:13 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: reopenedclosed

Este ticket ya ha sido resuelto hace semanas, al menos en lo que respecta al motor de compresión ZipArchive. Más adelante se puede reabrir si se desea añadir algún otro.

comment:14 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: closedreopened

Sería necesario hacer algunas mejoras a PackArchive

  1. Añadir un argumento 'Real remove' para indicar que se borren los archivos o directorios para facilitar el manejo
  2. Añadir funciones de empaquetado y desempaquetado de ficheros sueltos.
  3. Poner los comentarios con _.autodoc.member

comment:15 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: reopenedclosed

(In [3319]) Fixed #922

comment:16 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: closedreopened

Las rutinas para la compactación de ficheros individuales no están funcionando correctamente

comment:17 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: reopenedclosed

(In [3322]) Fixes #922

comment:18 Changed 14 years ago by Víctor de Buen Remiro

(In [3323]) Refs #922

Note: See TracTickets for help on using tickets.