Artículo
Mathew Lambert · Jul 24, 2020 Lectura de 2 min

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.

00
0 0 0 47
Log in or sign up to continue