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

Last modified 14 years ago

#922 closed task

Utilidades TOL de compresión y archivado de ficheros y directorios — at Version 3

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 (3)

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
Note: See TracTickets for help on using tickets.