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

Функция tar.NewReader

Функция tar.NewReader создает новый Reader для чтения данных из TAR-архива. Она принимает один параметр - интерфейс io.Reader, из которого будут читаться данные архива. Функция возвращает указатель на структуру tar.Reader, с помощью которой можно последовательно читать файлы и директории, содержащиеся в архиве.

Синтаксис

tar.NewReader(r io.Reader) *tar.Reader

Пример

Создадим TAR-архив в памяти и прочитаем его с помощью tar.NewReader. В этом примере мы создаем архив, содержащий один файл, а затем читаем заголовок и данные этого файла:

package main import ( "archive/tar" "bytes" "fmt" "io" "strings" ) func main() { // Создаем буфер для хранения архива var buf bytes.Buffer // Создаем Writer для записи в буфер tw := tar.NewWriter(&buf) // Создаем заголовок файла hdr := &tar.Header{ Name: "example.txt", Mode: 0600, Size: 11, } // Записываем заголовок if err := tw.WriteHeader(hdr); err != nil { fmt.Println("Error writing header:", err) return } // Записываем содержимое файла if _, err := tw.Write([]byte("Hello World")); err != nil { fmt.Println("Error writing file:", err) return } // Закрываем Writer if err := tw.Close(); err != nil { fmt.Println("Error closing writer:", err) return } // Создаем Reader для чтения архива из буфера tr := tar.NewReader(&buf) // Читаем файлы из архива for { header, err := tr.Next() if err == io.EOF { break } if err != nil { fmt.Println("Error reading archive:", err) return } fmt.Printf("File: %s, Size: %d\n", header.Name, header.Size) // Читаем содержимое файла var content bytes.Buffer if _, err := io.Copy(&content, tr); err != nil { fmt.Println("Error reading content:", err) return } fmt.Printf("Content: %s\n", content.String()) } }

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

"File: example.txt, Size: 11" "Content: Hello World"

Пример

Прочитаем TAR-архив, содержащий несколько файлов и директорий. Для каждого элемента архива выведем его имя и тип:

package main import ( "archive/tar" "bytes" "fmt" "io" ) func main() { // Создаем буфер с архивом var buf bytes.Buffer tw := tar.NewWriter(&buf) // Добавляем директорию hdr1 := &tar.Header{ Name: "docs/", Mode: 0755, Typeflag: tar.TypeDir, } tw.WriteHeader(hdr1) // Добавляем файл в директорию hdr2 := &tar.Header{ Name: "docs/readme.txt", Mode: 0644, Size: 7, } tw.WriteHeader(hdr2) tw.Write([]byte("content")) // Добавляем файл в корень hdr3 := &tar.Header{ Name: "data.txt", Mode: 0644, Size: 5, } tw.WriteHeader(hdr3) tw.Write([]byte("12345")) tw.Close() // Читаем архив tr := tar.NewReader(&buf) for { header, err := tr.Next() if err == io.EOF { break } if err != nil { fmt.Println("Error:", err) return } // Определяем тип элемента entryType := "file" if header.Typeflag == tar.TypeDir { entryType = "directory" } fmt.Printf("%s: %s\n", header.Name, entryType) } }

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

"docs/: directory" "docs/readme.txt: file" "data.txt: file"

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

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