﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
922	Utilidades TOL de compresión y archivado de ficheros y directorios	Víctor de Buen Remiro	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 @Archive
{
  //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 = """";
  //Abre el archivo para lectura o escritura
  Real Open(Text path, Text readOrWrite);
  //Cierra el archivo
  Real Close();
  //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)
};
}}}

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: @Archive 
{ 
  Text _.engine = ""ZLib"";
  Text _.engine = "".zip"";
  ... 
};
Class @SevenZip: @Archive { ... };
{ 
  Text _.engine = ""LZMA"";
  Text _.ext = "".7z"";
  ... 
};
Class @Rar: @Archive { ... };
{ 
  Text _.engine = ""Rar"";
  Text _.ext = "".rar"";
  ... 
};
Class @Tar: @Archive { ... };
{ 
  Text _.engine = ""Tar"";
  Text _.ext = "".tar"";
  ... 
};

}}}

Toda esta jerarquía de clases sería conveniente distribuirla como un paquete oficial que podría llamarse {{{CompactArchive}}}. 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 {{{CompactArchive::@Archive}}}

{{{
@Archive 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 CompactArchive.Open(NameBlock archive, Text path, Text readOrWrite);
  //Cierra el archivo
  Real CompactArchive.Close(NameBlock archive);
  //Añade un fichero al archivo
  Real CompactArchive.File.Add(NameBlock archive, Set originalFilePath);
  //Extrae un fichero del archivo
  Real CompactArchive.File.Extract(NameBlock archive, Text originalFilePath, Text destinationDirPath);
  //Determina si existe o no un fichero dentro del archivo
  Real CompactArchive.File.Exists(NameBlock archive, Text originalFilePath)
  //Añade un directorio completo recursivamente
  Real CompactArchive.Dir.Add(NameBlock archive, Text originalDirPath);
  //Extrae un directorio completo recursivamente
  Real CompactArchive.Dir.Extract(NameBlock archive, Text originalDirPat, Text destinationDirPath);
  //Determina si existe o no un directorio dentro del archivo
  Real CompactArchive.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."	defect	new	highest		ASCII data files		blocker			
