Herramienta de compresión tar en ObjectScript
¡Hola desarrolladores!
Estoy seguro de que la mayoría de vosotros ya conoceis la posibilidad de usar GZIP en los productos de InterSystems. Pero el problema es que GZIP trabaja con un único archivo o flujo de datos, y no admite carpetas. Al trabajar con sistemas Unix, es posible solucionarlo con la herramienta de compresión tar, incluida en cada sistema Linux de forma predeterminada. Pero ¿qué hacer si debemos trabajar también en Windows, que no lo incluye?
Me alegra poder enseñaros el nuevo proyecto, isc-tar
, que os ayudará a no preocuparos del sistema operativo y os permitirá gestionar los archivos tar en cualquier sitio.
Instalación
- Ve a la página releases (versiones), descarga la última versión de zUtils.FileBinaryTar.xml.
- Importa y compila de tu forma preferida en cualquier namespace.
%SYS>Do $system.OBJ.Load("zUtils.FileBinaryTar.xml", "c")
- Ahora estará disponible desde cualquier sitio por el nombre de clase
%zUtils.FileBinaryTar
Requirimientos y limitaciones
Ha sido probado en InterSystems IRIS Community Edition 2019.1, pero debería funcionar en casi cualquier otra versión. La excepción es la clase %Stream.FileBinaryGzip, que antes se encargaba de los gzip, y apareció en 2015.1.
En este momento, la herramienta no se preocupa de los permisos guardados en el tar, únicamente de la estructura de carpetas y el contenido de los archivos
Uso
- Puedes comprimir cualquier carpeta o un solo archivo, cuando no se requiere el nombre del archivo, aún devuelve el stream comprimido.
Set gzip = 1 Set archive = ##class(%zUtils.FileBinaryTar).Compact("/tmp/some/place", gzip, "/tmp/some.tgz")
- Puedes extraer el archivo a alguna estructura temporal extendida desde %ArrayOfDatatypes y así podrás encontrar cualquier archivo si conoces el nombre exacto
Set gzip = 1 Set extracted = ##class(%zUtils.FileBinaryTar).ExtractFile("/tmp/some.tgz", gzip) Set tSC = extracted.FindPath("folder/subfolder/test.txt", .file) Set fileContent = file.fileData While 'fileContent.AtEnd { /// read file from archive }
- Puedes guardar lo extraído en una carpeta
Set tSC = extracted.ExtractTo("/tmp/some/place")
- O extraer únicamente un stream
Set extracted = ##class(%zUtils.FileBinaryTar).ExtractStream(stream)
Nota: el segundo parámetro gzip está activado de forma predeterminada.
Cualquier notificación de problema o "pull-request" siempre es bienvenida en el repositorio.