zip

package
v1.21.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 9, 2023 License: MIT Imports: 6 Imported by: 0

Documentation

Overview

Package zip は、ZIP アーカイブの読み書きをサポートします。

詳細については、ZIP specification を参照してください。

このパッケージはディスクスパニングをサポートしていません。

ZIP64 についての注意点:

後方互換性を保つために、FileHeader には 32 ビットと 64 ビットの両方の Size フィールドがあります。 64 ビットフィールドには常に正しい値が含まれ、通常のアーカイブでは両方のフィールドが同じ値になります。 ZIP64 形式が必要なファイルの場合、32 ビットフィールドは 0xffffffff になり、代わりに 64 ビットフィールドを使用する必要があります。

Index

Examples

Constants

View Source
const (
	Store   uint16 = 0
	Deflate uint16 = 8
)

圧縮方式

Variables

View Source
var (
	ErrFormat       = errors.New("zip: not a valid zip file")
	ErrAlgorithm    = errors.New("zip: unsupported compression algorithm")
	ErrChecksum     = errors.New("zip: checksum error")
	ErrInsecurePath = errors.New("zip: insecure file path")
)

Functions

func RegisterCompressor added in v1.2.0

func RegisterCompressor(method uint16, comp Compressor)

RegisterCompressor は、特定のメソッド ID にカスタムの圧縮プログラムを登録または上書きします。 一般的なメソッド Store と Deflate は組み込みです。

func RegisterDecompressor added in v1.2.0

func RegisterDecompressor(method uint16, dcomp Decompressor)

RegisterDecompressor は、特定のメソッド ID にカスタムの解凍プログラムを登録または上書きします。 メソッドの解凍プログラムが見つからない場合、Writer はパッケージレベルで解凍プログラムを検索します。 一般的なメソッド Store と Deflate は組み込みです。

Types

type Compressor added in v1.2.0

type Compressor func(w io.Writer) (io.WriteCloser, error)

Compressor は、w に書き込む新しい圧縮ライターを返します。 WriteCloser の Close メソッドは、保留中のデータを w にフラッシュするために使用する必要があります。 Compressor 自体は、複数のゴルーチンから同時に呼び出されることができますが、 各返されたライターは一度に1つのゴルーチンによってのみ使用されます。

type Decompressor added in v1.2.0

type Decompressor func(r io.Reader) io.ReadCloser

Decompressor は、r から読み取る新しい解凍リーダーを返します。 ReadCloser の Close メソッドは、関連するリソースを解放するために使用する必要があります。 Decompressor 自体は、複数のゴルーチンから同時に呼び出されることができますが、 各返されたリーダーは一度に1つのゴルーチンによってのみ使用されます。

type File

type File struct {
	FileHeader
	// contains filtered or unexported fields
}

File は、ZIP アーカイブ内の単一のファイルです。 ファイル情報は、埋め込み FileHeader にあります。 ファイルの内容は、Open を呼び出すことでアクセスできます。

func (*File) DataOffset added in v1.2.0

func (f *File) DataOffset() (offset int64, err error)

DataOffset は、ファイルの圧縮された可能性のあるデータのオフセットを、zip ファイルの先頭からの相対位置で返します。

ほとんどの呼び出し元は、データを透過的に解凍し、チェックサムを検証する Open を代わりに使用する必要があります。

func (*File) Open

func (f *File) Open() (io.ReadCloser, error)

Open は、ファイルの内容にアクセスする ReadCloser を返します。 複数のファイルを同時に読み取ることができます。

func (*File) OpenRaw added in v1.17.0

func (f *File) OpenRaw() (io.Reader, error)

OpenRaw returns a Reader that provides access to the File's contents without decompression.

type FileHeader

type FileHeader struct {
	// Name is the name of the file.
	//
	// It must be a relative path, not start with a drive letter (such as "C:"),
	// and must use forward slashes instead of back slashes. A trailing slash
	// indicates that this file is a directory and should have no data.
	Name string

	// Comment is any arbitrary user-defined string shorter than 64KiB.
	Comment string

	// NonUTF8 indicates that Name and Comment are not encoded in UTF-8.
	//
	// By specification, the only other encoding permitted should be CP-437,
	// but historically many ZIP readers interpret Name and Comment as whatever
	// the system's local character encoding happens to be.
	//
	// This flag should only be set if the user intends to encode a non-portable
	// ZIP file for a specific localized region. Otherwise, the Writer
	// automatically sets the ZIP format's UTF-8 flag for valid UTF-8 strings.
	NonUTF8 bool

	CreatorVersion uint16
	ReaderVersion  uint16
	Flags          uint16

	// Method is the compression method. If zero, Store is used.
	Method uint16

	// Modified is the modified time of the file.
	//
	// When reading, an extended timestamp is preferred over the legacy MS-DOS
	// date field, and the offset between the times is used as the timezone.
	// If only the MS-DOS date is present, the timezone is assumed to be UTC.
	//
	// When writing, an extended timestamp (which is timezone-agnostic) is
	// always emitted. The legacy MS-DOS date field is encoded according to the
	// location of the Modified time.
	Modified time.Time

	// ModifiedTime is an MS-DOS-encoded time.
	//
	// Deprecated: Use Modified instead.
	ModifiedTime uint16

	// ModifiedDate is an MS-DOS-encoded date.
	//
	// Deprecated: Use Modified instead.
	ModifiedDate uint16

	// CRC32 is the CRC32 checksum of the file content.
	CRC32 uint32

	// CompressedSize is the compressed size of the file in bytes.
	// If either the uncompressed or compressed size of the file
	// does not fit in 32 bits, CompressedSize is set to ^uint32(0).
	//
	// Deprecated: Use CompressedSize64 instead.
	CompressedSize uint32

	// UncompressedSize is the compressed size of the file in bytes.
	// If either the uncompressed or compressed size of the file
	// does not fit in 32 bits, CompressedSize is set to ^uint32(0).
	//
	// Deprecated: Use UncompressedSize64 instead.
	UncompressedSize uint32

	// CompressedSize64 is the compressed size of the file in bytes.
	CompressedSize64 uint64

	// UncompressedSize64 is the uncompressed size of the file in bytes.
	UncompressedSize64 uint64

	Extra         []byte
	ExternalAttrs uint32
}

FileHeader は、ZIP ファイル内のファイルを説明します。 詳細については、ZIP specification を参照してください。

func FileInfoHeader

func FileInfoHeader(fi fs.FileInfo) (*FileHeader, error)

FileInfoHeaderは、fs.FileInfoから部分的に設定されたFileHeaderを作成します。 fs.FileInfoのNameメソッドは、記述するファイルのベース名のみを返すため、 ファイルの完全なパス名を提供するために、返されたヘッダーのNameフィールドを変更する必要がある場合があります。 圧縮が必要な場合は、呼び出し元はFileHeader.Methodフィールドを設定する必要があります。デフォルトでは設定されていません。

func (*FileHeader) FileInfo

func (h *FileHeader) FileInfo() fs.FileInfo

FileInfo は、FileHeader の fs.FileInfo を返します。

func (*FileHeader) ModTime deprecated

func (h *FileHeader) ModTime() time.Time

ModTime は、旧来の ModifiedDate および ModifiedTime フィールドを使用して、UTC での変更時刻を返します。

Deprecated: 代わりに Modified を使用してください。

func (*FileHeader) Mode

func (h *FileHeader) Mode() (mode fs.FileMode)

Mode は、FileHeader のパーミッションとモードビットを返します。

func (*FileHeader) SetModTime deprecated

func (h *FileHeader) SetModTime(t time.Time)

SetModTime は、与えられた時刻を UTC で指定して、Modified、ModifiedTime、および ModifiedDate フィールドを設定します。

Deprecated: 代わりに Modified を使用してください。

func (*FileHeader) SetMode

func (h *FileHeader) SetMode(mode fs.FileMode)

SetMode は、FileHeader のパーミッションとモードビットを変更します。

type ReadCloser

type ReadCloser struct {
	Reader
	// contains filtered or unexported fields
}

ReadCloser は、不要になったときに閉じる必要がある Reader です。

func OpenReader

func OpenReader(name string) (*ReadCloser, error)

OpenReader は、指定された名前の Zip ファイルを開き、ReadCloser を返します。

アーカイブ内のファイルのいずれかが、[filepath.IsLocal] によって定義されるローカルでない名前 またはバックスラッシュを含む名前を使用している場合、 および GODEBUG 環境変数に `zipinsecurepath=0` が含まれている場合、 OpenReader は ErrInsecurePath エラーを返すリーダーを返します。 将来の Go のバージョンでは、この動作がデフォルトで導入される可能性があります。 ローカルでない名前を受け入れたいプログラムは、ErrInsecurePath エラーを無視して返されたリーダーを使用できます。

func (*ReadCloser) Close

func (rc *ReadCloser) Close() error

Close は、Zip ファイルを閉じ、I/O に使用できなくします。

type Reader

type Reader struct {
	File    []*File
	Comment string
	// contains filtered or unexported fields
}

Reader は、ZIP アーカイブからコンテンツを提供するための構造体です。

Example
package main

import (
	"github.com/shogo82148/std/archive/zip"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/io"
	"github.com/shogo82148/std/log"
	"github.com/shogo82148/std/os"
)

func main() {
	// 読み取り用に zip アーカイブを開きます。
	r, err := zip.OpenReader("testdata/readme.zip")
	if err != nil {
		log.Fatal(err)
	}
	defer r.Close()

	// アーカイブ内のファイルを反復処理し、その内容の一部を出力します。
	for _, f := range r.File {
		fmt.Printf("Contents of %s:\n", f.Name)
		rc, err := f.Open()
		if err != nil {
			log.Fatal(err)
		}
		_, err = io.CopyN(os.Stdout, rc, 68)
		if err != nil {
			log.Fatal(err)
		}
		rc.Close()
		fmt.Println()
	}
}
Output:

Contents of README:
This is the source code repository for the Go programming language.

func NewReader

func NewReader(r io.ReaderAt, size int64) (*Reader, error)

NewReader は、指定されたサイズを持つと想定される r から読み取る新しい Reader を返します。

アーカイブ内のファイルのいずれかが、[filepath.IsLocal] によって定義されるローカルでない名前 またはバックスラッシュを含む名前を使用している場合、 および GODEBUG 環境変数に `zipinsecurepath=0` が含まれている場合、 NewReader は ErrInsecurePath エラーを返すリーダーを返します。 将来の Go のバージョンでは、この動作がデフォルトで導入される可能性があります。 ローカルでない名前を受け入れたいプログラムは、ErrInsecurePath エラーを無視して返されたリーダーを使用できます。

func (*Reader) Open added in v1.16.0

func (r *Reader) Open(name string) (fs.File, error)

Openは、fs.FS.Openのセマンティクスを使用して、ZIPアーカイブ内の指定されたファイルを開きます。 パスは常にスラッシュで区切られ、先頭に/または../要素はありません。

func (*Reader) RegisterDecompressor added in v1.6.0

func (r *Reader) RegisterDecompressor(method uint16, dcomp Decompressor)

RegisterDecompressor は、特定のメソッド ID にカスタムの解凍プログラムを登録または上書きします。 メソッドの解凍プログラムが見つからない場合、Reader はパッケージレベルで解凍プログラムを検索します。

type Writer

type Writer struct {
	// contains filtered or unexported fields
}

Writer は、ZIP ファイルのライターを実装します。

Example
package main

import (
	"github.com/shogo82148/std/archive/zip"
	"github.com/shogo82148/std/bytes"
	"github.com/shogo82148/std/log"
)

func main() {
	// アーカイブを書き込むためのバッファを作成します。
	buf := new(bytes.Buffer)

	// 新しい zip アーカイブを作成します。
	w := zip.NewWriter(buf)

	// アーカイブにいくつかのファイルを追加します。
	var files = []struct {
		Name, Body string
	}{
		{"readme.txt", "このアーカイブにはいくつかのテキストファイルが含まれています。"},
		{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
		{"todo.txt", "動物取扱業免許を取得する。\nもっと例を書く。"},
	}
	for _, file := range files {
		f, err := w.Create(file.Name)
		if err != nil {
			log.Fatal(err)
		}
		_, err = f.Write([]byte(file.Body))
		if err != nil {
			log.Fatal(err)
		}
	}

	// Close でエラーを確認することを忘れないでください。
	err := w.Close()
	if err != nil {
		log.Fatal(err)
	}
}
Output:

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter は、w に ZIP ファイルを書き込む新しい Writer を返します。

func (*Writer) Close

func (w *Writer) Close() error

Close は、中央ディレクトリを書き込むことで zip ファイルの書き込みを終了します。 基になるライターを閉じません。

func (*Writer) Copy added in v1.17.0

func (w *Writer) Copy(f *File) error

Copy は、ファイル f(Reader から取得された)を w にコピーします。 これは、解凍、圧縮、および検証をバイパスして、生の形式で直接コピーします。

func (*Writer) Create

func (w *Writer) Create(name string) (io.Writer, error)

Create は、指定された名前を使用してファイルを zip ファイルに追加します。 返される Writer にファイルの内容を書き込む必要があります。 ファイルの内容は、Deflate メソッドを使用して圧縮されます。 名前は相対パスである必要があります。 ドライブレター(例:C:)または先頭のスラッシュで始まることはできず、 スラッシュのみが許可されます。 ファイルではなくディレクトリを作成するには、名前の末尾にスラッシュを追加します。 次の Create、CreateHeader、または Close を呼び出す前に、ファイルの内容を io.Writer に書き込む必要があります。

func (*Writer) CreateHeader

func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error)

CreateHeader は、ファイルメタデータに提供された FileHeader を使用して、zip アーカイブにファイルを追加します。 Writer は fh を所有し、そのフィールドを変更する可能性があります。 CreateHeader を呼び出した後、呼び出し元は fh を変更してはいけません。

これは、ファイルの内容を書き込む必要がある Writer を返します。 次の Create、CreateHeader、CreateRaw、または Close を呼び出す前に、ファイルの内容を io.Writer に書き込む必要があります。

func (*Writer) CreateRaw added in v1.17.0

func (w *Writer) CreateRaw(fh *FileHeader) (io.Writer, error)

CreateRaw は、提供された FileHeader を使用して zip アーカイブにファイルを追加し、 ファイルの内容を書き込むための Writer を返します。 次の Create、CreateHeader、CreateRaw、または Close を呼び出す前に、ファイルの内容を io.Writer に書き込む必要があります。

CreateHeader とは異なり、Writer に渡されるバイトは圧縮されません。

func (*Writer) Flush added in v1.4.0

func (w *Writer) Flush() error

Flush は、バッファリングされたデータを基になるライターにフラッシュします。 Flush を呼び出す必要は通常ありません。Close を呼び出すだけで十分です。

func (*Writer) RegisterCompressor added in v1.6.0

func (w *Writer) RegisterCompressor(method uint16, comp Compressor)

RegisterCompressor は、特定のメソッド ID にカスタムの圧縮プログラムを登録または上書きします。 メソッドの圧縮プログラムが見つからない場合、Writer はパッケージレベルで圧縮プログラムを検索します。

Example
package main

import (
	"github.com/shogo82148/std/archive/zip"
	"github.com/shogo82148/std/bytes"
	"github.com/shogo82148/std/compress/flate"
	"github.com/shogo82148/std/io"
)

func main() {
	// デフォルトの Deflate 圧縮プログラムを、より高い圧縮レベルのカスタム圧縮プログラムで上書きします。

	// アーカイブを書き込むためのバッファを作成します。
	buf := new(bytes.Buffer)

	// 新しい zip アーカイブを作成します。
	w := zip.NewWriter(buf)

	// カスタムの Deflate 圧縮プログラムを登録します。
	w.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {
		return flate.NewWriter(out, flate.BestCompression)
	})

	// ファイルを w に追加します。
}
Output:

func (*Writer) SetComment added in v1.10.0

func (w *Writer) SetComment(comment string) error

SetComment は、中央ディレクトリのコメントフィールドを設定します。 Close を呼び出す前にのみ呼び出すことができます。

func (*Writer) SetOffset added in v1.5.0

func (w *Writer) SetOffset(n int64)

SetOffset は、zip データの開始オフセットを基になるライター内に設定します。 これは、バイナリ実行可能ファイルなどに zip データが追加される場合に使用する必要があります。 データが書き込まれる前に呼び出す必要があります。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL