Метод tar.Writer.Close

Метод tar.Writer.Close завершает процесс записи TAR-архива. Он записывает два нулевых блока в конец архива, что является обязательным требованием формата TAR для обозначения конца архива. Также этот метод закрывает связанный с архиватором io.Writer, если он реализует интерфейс io.Closer. Метод возвращает ошибку, если в процессе записи финальных блоков возникли проблемы.

Синтаксис

goerr := writer.Close()

Пример

Давайте создадим TAR-архив и запишем в него один файл, после чего закроем архиватор:

gopackage main

import (
  "archive/tar"
  "bytes"
  "fmt"
)

func main() {
  var buf bytes.Buffer
  tw := tar.NewWriter(&buf)

  hdr := &tar.Header{
    Name: "file.txt",
    Mode: 0600,
    Size: 5,
  }
  err := tw.WriteHeader(hdr)
  if err != nil {
    fmt.Println("WriteHeader error:", err)
    return
  }

  _, err = tw.Write([]byte("hello"))
  if err != nil {
    fmt.Println("Write error:", err)
    return
  }

  err = tw.Close()
  if err != nil {
    fmt.Println("Close error:", err)
    return
  }

  fmt.Println("Archive size:", buf.Len())
}

Результат выполнения кода:

go"Archive size: 1536"

Пример

Метод Close обязательно должен быть вызван, иначе архив будет невалидным. Если не вызвать Close, финальные нулевые блоки не будут записаны:

gopackage main

import (
  "archive/tar"
  "bytes"
  "fmt"
)

func main() {
  var buf bytes.Buffer
  tw := tar.NewWriter(&buf)

  hdr := &tar.Header{
    Name: "file.txt",
    Mode: 0600,
    Size: 3,
  }
  tw.WriteHeader(hdr)
  tw.Write([]byte("foo"))
  // Close не вызывается

  fmt.Println("Archive size:", buf.Len())
}

Результат выполнения кода:

go"Archive size: 1024"

Валидный архив должен заканчиваться двумя нулевыми блоками, поэтому при работе с TAR всегда следует закрывать архиватор.

Пример

При возникновении ошибки в процессе записи финальных блоков, метод Close вернет ошибку:

gopackage main

import (
  "archive/tar"
  "errors"
  "fmt"
  "io"
)

type errorWriter struct{}

func (ew errorWriter) Write(p []byte) (int, error) {
  return 0, errors.New("write error")
}

func main() {
  tw := tar.NewWriter(errorWriter{})

  hdr := &tar.Header{
    Name: "file.txt",
    Mode: 0600,
    Size: 4,
  }
  tw.WriteHeader(hdr)
  tw.Write([]byte("test"))

  err := tw.Close()
  if err != nil {
    fmt.Println("Close error:", err)
  }
}

Результат выполнения кода:

go"Close error: write error"

Смотрите также

  • метод tar.Writer.WriteHeader,
    который записывает заголовок файла в архив
  • функцию tar.NewWriter,
    которая создает новый архиватор TAR
  • структуру tar.Reader,
    которая используется для чтения TAR-архивов
  • структуру tar.Header,
    которая описывает метаданные файла в архиве