Метод tar.Writer.WriteHeader
Метод tar.Writer.WriteHeader записывает заголовок файла в TAR-архив.
В первый параметр мы передаем указатель на структуру tar.Header,
которая содержит метаданные файла: имя, размер, права доступа и другие атрибуты.
После успешной записи заголовка, мы можем записать содержимое файла с помощью метода Write.
Важно помнить, что заголовок должен быть записан перед содержимым каждого файла в архиве.
Синтаксис
err := writer.WriteHeader(header)
Пример
Давайте создадим TAR-архив и запишем в него один файл с содержимым:
package main
import (
"archive/tar"
"bytes"
"fmt"
"os"
)
func main() {
// Create a buffer to write our archive to.
buf := new(bytes.Buffer)
// Create a new tar writer.
tw := tar.NewWriter(buf)
// Create a header for the file.
header := &tar.Header{
Name: "example.txt",
Mode: 0644,
Size: 11,
}
// Write the header.
err := tw.WriteHeader(header)
if err != nil {
fmt.Println("Error writing header:", err)
return
}
// Write the file content.
content := []byte("Hello World")
_, err = tw.Write(content)
if err != nil {
fmt.Println("Error writing content:", err)
return
}
// Close the tar writer.
tw.Close()
// Write the archive to a file.
err = os.WriteFile("example.tar", buf.Bytes(), 0644)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
fmt.Println("TAR archive created successfully")
}
Результат выполнения кода:
"TAR archive created successfully"
Пример
Давайте создадим TAR-архив с несколькими файлами в разных директориях:
package main
import (
"archive/tar"
"bytes"
"fmt"
"os"
)
func main() {
buf := new(bytes.Buffer)
tw := tar.NewWriter(buf)
files := []struct {
Name string
Content string
}{
{"dir1/file1.txt", "Content of file 1"},
{"dir2/file2.txt", "Content of file 2"},
{"file3.txt", "Content of file 3"},
}
for _, f := range files {
header := &tar.Header{
Name: f.Name,
Mode: 0644,
Size: int64(len(f.Content)),
}
err := tw.WriteHeader(header)
if err != nil {
fmt.Println("Error writing header:", err)
return
}
_, err = tw.Write([]byte(f.Content))
if err != nil {
fmt.Println("Error writing content:", err)
return
}
}
tw.Close()
err := os.WriteFile("multiple.tar", buf.Bytes(), 0644)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
fmt.Println("TAR archive with multiple files created")
}
Результат выполнения кода:
"TAR archive with multiple files created"
Пример
Давайте создадим TAR-архив и запишем в него файл с указанием прав доступа и времени модификации:
package main
import (
"archive/tar"
"bytes"
"fmt"
"os"
"time"
)
func main() {
buf := new(bytes.Buffer)
tw := tar.NewWriter(buf)
now := time.Now()
header := &tar.Header{
Name: "config.txt",
Mode: 0600,
Size: 12,
ModTime: now,
Uid: 1000,
Gid: 1000,
}
err := tw.WriteHeader(header)
if err != nil {
fmt.Println("Error writing header:", err)
return
}
content := []byte("config data")
_, err = tw.Write(content)
if err != nil {
fmt.Println("Error writing content:", err)
return
}
tw.Close()
err = os.WriteFile("config.tar", buf.Bytes(), 0644)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
fmt.Println("TAR archive with metadata created")
}
Результат выполнения кода:
"TAR archive with metadata created"
Смотрите также
-
пакет
archive/tar,
который предоставляет функциональность для работы с TAR-архивами -
функцию
tar.NewWriter,
которая создает новый TAR-писатель -
метод
tar.Writer.Close,
который закрывает TAR-писатель и завершает запись архива -
структуру
tar.Header,
которая содержит метаданные файла в TAR-архиве