Тип tar.Writer
Тип tar.Writer используется для создания tar-архивов.
Он предоставляет методы для записи заголовков файлов и их содержимого.
Первый параметр - это объект, реализующий интерфейс io.Writer,
в который будет производиться запись архива.
Синтаксис
type Writer struct {
// содержит скрытые поля
}
func NewWriter(w io.Writer) *Writer
func (tw *Writer) WriteHeader(hdr *Header) error
func (tw *Writer) Write(b []byte) (int, error)
func (tw *Writer) Close() error
Пример
Создадим tar-архив и запишем в него один файл:
package main
import (
"archive/tar"
"bytes"
"fmt"
"log"
)
func main() {
// Создаем буфер для хранения архива
buf := new(bytes.Buffer)
// Создаем новый tar.Writer
tw := tar.NewWriter(buf)
// Создаем заголовок для файла
hdr := &tar.Header{
Name: "file.txt",
Mode: 0600,
Size: int64(len("Hello, World!")),
}
// Записываем заголовок
err := tw.WriteHeader(hdr)
if err != nil {
log.Fatal(err)
}
// Записываем содержимое файла
_, err = tw.Write([]byte("Hello, World!"))
if err != nil {
log.Fatal(err)
}
// Закрываем архив
err = tw.Close()
if err != nil {
log.Fatal(err)
}
fmt.Println("Archive size:", buf.Len())
}
Результат выполнения кода:
"Archive size: 512"
Пример
Запишем несколько файлов в один tar-архив:
package main
import (
"archive/tar"
"bytes"
"fmt"
"log"
)
func main() {
buf := new(bytes.Buffer)
tw := tar.NewWriter(buf)
// Создаем первый файл
hdr1 := &tar.Header{
Name: "file1.txt",
Mode: 0644,
Size: int64(len("Content 1")),
}
err := tw.WriteHeader(hdr1)
if err != nil {
log.Fatal(err)
}
_, err = tw.Write([]byte("Content 1"))
if err != nil {
log.Fatal(err)
}
// Создаем второй файл
hdr2 := &tar.Header{
Name: "file2.txt",
Mode: 0644,
Size: int64(len("Content 2")),
}
err = tw.WriteHeader(hdr2)
if err != nil {
log.Fatal(err)
}
_, err = tw.Write([]byte("Content 2"))
if err != nil {
log.Fatal(err)
}
err = tw.Close()
if err != nil {
log.Fatal(err)
}
fmt.Println("Archive contains 2 files, size:", buf.Len())
}
Результат выполнения кода:
"Archive contains 2 files, size: 1024"
Пример
Запишем файл с директорией и вложенным файлом:
package main
import (
"archive/tar"
"bytes"
"fmt"
"log"
)
func main() {
buf := new(bytes.Buffer)
tw := tar.NewWriter(buf)
// Создаем директорию
dirHdr := &tar.Header{
Name: "dir/",
Mode: 0755,
Typeflag: tar.TypeDir,
}
err := tw.WriteHeader(dirHdr)
if err != nil {
log.Fatal(err)
}
// Создаем файл внутри директории
fileHdr := &tar.Header{
Name: "dir/file.txt",
Mode: 0644,
Size: int64(len("Nested file content")),
}
err = tw.WriteHeader(fileHdr)
if err != nil {
log.Fatal(err)
}
_, err = tw.Write([]byte("Nested file content"))
if err != nil {
log.Fatal(err)
}
err = tw.Close()
if err != nil {
log.Fatal(err)
}
fmt.Println("Archive with directory and nested file, size:", buf.Len())
}
Результат выполнения кода:
"Archive with directory and nested file, size: 1024"
Смотрите также
-
тип
tar.Reader,
который используется для чтения tar-архивов -
функцию
tar.NewWriter,
которая создает новый экземплярtar.Writer -
метод
tar.Writer.WriteHeader,
который записывает заголовок файла в архив -
метод
tar.Writer.Close,
который закрывает архив и записывает финальные блоки