Saltar al contenido

Golang: agregar archivo a un archivo tar existente

Luego de de una larga recopilación de datos pudimos resolver esta contrariedad que tienen ciertos los usuarios. Te regalamos la respuesta y nuestro deseo es resultarte de gran ayuda.

Solución:

los tar la especificación del archivo establece:

Un archivo tar consta de una serie de registros de 512 bytes. Cada objeto del sistema de archivos requiere un registro de encabezado que almacene metadatos básicos (nombre de ruta, propietario, permisos, etc.) y cero o más registros que contengan datos de archivo. El final del archivo está indicado por dos registros que consisten completamente en cero bytes.

La implementación de Go de agregar estos dos registros con ceros ocurre aquí.

para moverse por el tar tráiler de formato de archivo (básicamente 1024 bytes de nada) podría reemplazar las líneas:

f, err = os.OpenFile("/home/jeff/Desktop/test.tar", os.O_APPEND|os.O_WRONLY, os.ModePerm)
if err != nil 
    log.Fatalln(err)

tw = tar.NewWriter(f)

Con:

f, err = os.OpenFile("/home/jeff/Desktop/test.tar", os.O_RDWR, os.ModePerm)
if err != nil 
    log.Fatalln(err)

if _, err = f.Seek(-1024, os.SEEK_END); err != nil 
    log.Fatalln(err)

tw = tar.NewWriter(f)

Abre el archivo de lectura/escritura (en lugar de agregar/solo escribir) y luego busca 1024 bytes antes del final del archivo y escribe desde allí.

Funciona, pero es un truco horrible.

EDITAR: Después de entender el tar especificaciones de archivo un poco mejor, ya no creo que esto sea un truco.

Código completo: http://play.golang.org/p/0zRScmY4AC

Es solo una interfaz de escritura, así que escriba bytes después de escribir el encabezado de sus archivos.

import (
  "archive/tar"
  "os"
)

f, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY, os.ModePerm)
if err != nil 
// handle error here


hdr := tar.Header
// populate your header
tw := tar.NewWriter(f)
// append a file
tw.WriteHeader(hdr)
tw.Write(content_of_file_as_bytes)

http://golang.org/pkg/archive/tar/#Writer le dice todo lo que necesita saber.

EDITAR: Resulta que los archivos tar obtienen un avance escrito hasta el final cuando se cierra. Entonces, aunque esté escribiendo nuevos datos en el archivo tar, no se leerán más allá de ese tráiler. Entonces, en cambio, parece que primero tendrá que leer el archivo tar y luego volver a escribir todo el archivo en el disco, lo cual no es óptimo. Sin embargo, el paquete no admite las cosas necesarias para agregarlas, por lo que es lo mejor que puedo recomendar en este momento.

Valoraciones y comentarios

Tienes la posibilidad dar difusión a este tutorial si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *