Метод tar.Writer.Close
Метод tar.Writer.Close завершает процесс записи TAR-архива.
Он записывает два нулевых блока в конец архива, что является
обязательным требованием формата TAR для обозначения конца архива.
Также этот метод закрывает связанный с архиватором
io.Writer, если он реализует интерфейс
io.Closer. Метод возвращает ошибку, если в процессе
записи финальных блоков возникли проблемы.
Синтаксис
err := writer.Close()
Пример
Давайте создадим TAR-архив и запишем в него один файл, после чего закроем архиватор:
package 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())
}
Результат выполнения кода:
"Archive size: 1536"
Пример
Метод Close обязательно должен быть вызван,
иначе архив будет невалидным. Если не вызвать
Close, финальные нулевые блоки не будут записаны:
package 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())
}
Результат выполнения кода:
"Archive size: 1024"
Валидный архив должен заканчиваться двумя нулевыми блоками, поэтому при работе с TAR всегда следует закрывать архиватор.
Пример
При возникновении ошибки в процессе записи финальных блоков,
метод Close вернет ошибку:
package 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)
}
}
Результат выполнения кода:
"Close error: write error"
Смотрите также
-
метод
tar.Writer.WriteHeader,
который записывает заголовок файла в архив -
функцию
tar.NewWriter,
которая создает новый архиватор TAR -
структуру
tar.Reader,
которая используется для чтения TAR-архивов -
структуру
tar.Header,
которая описывает метаданные файла в архиве