РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1333 of 1593 menu

Метод tar.Reader.Next

Метод tar.Reader.Next возвращает указатель на структуру tar.Header, содержащую информацию о следующем файле в архиве (имя, размер, права доступа, время модификации и т.д.), и одновременно продвигает внутренний указатель чтения к началу данных этого файла. Метод вызывается без параметров и возвращает два значения: указатель на заголовок и ошибку. Если достигнут конец архива, возвращается ошибка io.EOF.

Синтаксис

func (tr *Reader) Next() (*Header, error)

Пример

Создадим tar-архив в памяти и последовательно прочитаем заголовки всех его файлов:

package main import ( "archive/tar" "bytes" "fmt" "io" "strings" ) func main() { // Создаем буфер и пишем в него архив с двумя файлами var buf bytes.Buffer tw := tar.NewWriter(&buf) headers := []string{"file1.txt", "file2.txt"} contents := []string{"Hello, World!", "Go is awesome"} for i := 0; i < len(headers); i++ { hdr := &tar.Header{ Name: headers[i], Mode: 0o644, Size: int64(len(contents[i])), } if err := tw.WriteHeader(hdr); err != nil { panic(err) } if _, err := tw.Write([]byte(contents[i])); err != nil { panic(err) } } tw.Close() // Создаем Reader из буфера и читаем заголовки tr := tar.NewReader(&buf) for { hdr, err := tr.Next() if err == io.EOF { break } if err != nil { panic(err) } fmt.Printf("Name: %s, Size: %d\n", hdr.Name, hdr.Size) } }

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

Name: file1.txt, Size: 13 Name: file2.txt, Size: 13

Пример

Прочитаем из архива только файлы с определенным именем и извлечем их содержимое:

package main import ( "archive/tar" "bytes" "fmt" "io" "strings" ) func main() { // Подготовка архива var buf bytes.Buffer tw := tar.NewWriter(&buf) files := map[string]string{ "data.txt": "12345", "info.txt": "67890", "ignore.me": "ignore", } for name, content := range files { hdr := &tar.Header{Name: name, Size: int64(len(content)), Mode: 0o644} tw.WriteHeader(hdr) tw.Write([]byte(content)) } tw.Close() // Поиск и чтение данных tr := tar.NewReader(&buf) target := "data.txt" for { hdr, err := tr.Next() if err == io.EOF { break } if err != nil { panic(err) } if hdr.Name == target { data, _ := io.ReadAll(tr) fmt.Printf("%s: %s\n", target, string(data)) break } } }

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

data.txt: 12345

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

  • тип tar.Header,
    который содержит метаданные файла в архиве
  • функцию tar.NewReader,
    которая создает новый Reader для чтения tar-архива
  • метод Writer.WriteHeader,
    который записывает заголовок файла при создании архива
  • пакет archive/zip,
    для работы с zip-архивами
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить