zip

package
v1.22.0 Latest Latest
Warning

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

Go to latest
Published: Feb 26, 2024 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 にカスタムの圧縮プログラムを登録または上書きします。 一般的なメソッド StoreDeflate は組み込みです。

func RegisterDecompressor added in v1.2.0

func RegisterDecompressor(method uint16, dcomp Decompressor)

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

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

type File

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

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

func (*File) DataOffset added in v1.2.0

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

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

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

func (*File) Open

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

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

func (*File) OpenRaw added in v1.17.0

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

OpenRawは、解凍せずに File の内容にアクセスを提供する Reader を返します。

type FileHeader

type FileHeader struct {
	// Nameはファイルの名前です。
	//
	// それは相対パスでなければならず、ドライブレター("C:"など)で始まってはならず、
	// バックスラッシュの代わりにフォワードスラッシュを使用しなければなりません。末尾のスラッシュは
	// このファイルがディレクトリであり、データを持つべきではないことを示します。
	Name string

	// Commentは64KiB未満の任意のユーザー定義文字列です。
	Comment string

	// NonUTF8は、NameとCommentがUTF-8でエンコードされていないことを示します。
	//
	// 仕様によれば、許可される他のエンコーディングはCP-437のみですが、
	// 歴史的に多くのZIPリーダーはNameとCommentをシステムのローカル文字エンコーディングとして解釈します。
	//
	// このフラグは、ユーザーが特定のローカライズされた地域の非ポータブルなZIPファイルをエンコードするつもりである場合にのみ設定するべきです。
	// それ以外の場合、Writerは有効なUTF-8文字列のZIP形式のUTF-8フラグを自動的に設定します。
	NonUTF8 bool

	CreatorVersion uint16
	ReaderVersion  uint16
	Flags          uint16

	// Methodは圧縮方法です。ゼロの場合、Storeが使用されます。
	Method uint16

	// Modifiedはファイルの変更時間です。
	//
	// 読み取り時には、レガシーなMS-DOSの日付フィールドよりも拡張タイムスタンプが優先され、
	// 時間のオフセットがタイムゾーンとして使用されます。
	// MS-DOSの日付のみが存在する場合、タイムゾーンはUTCとみなされます。
	//
	// 書き込み時には、タイムゾーンに依存しない拡張タイムスタンプが常に出力されます。
	// レガシーなMS-DOSの日付フィールドは、Modified時間の位置に従ってエンコードされます。
	Modified time.Time

	// ModifiedTimeはMS-DOSでエンコードされた時間です。
	//
	// Deprecated: 代わりにModifiedを使用してください。
	ModifiedTime uint16

	// ModifiedDateはMS-DOSでエンコードされた日付です。
	//
	// Deprecated: 代わりにModifiedを使用してください。
	ModifiedDate uint16

	// CRC32は、ファイル内容のCRC32チェックサムです。
	CRC32 uint32

	// CompressedSizeは、ファイルの圧縮サイズ(バイト単位)です。
	// ファイルの非圧縮または圧縮サイズが32ビットに収まらない場合、
	// CompressedSizeは^uint32(0)に設定されます。
	//
	// Deprecated: 代わりにCompressedSize64を使用してください。
	CompressedSize uint32

	// UncompressedSizeは、ファイルの非圧縮サイズ(バイト単位)です。
	// ファイルの非圧縮または圧縮サイズが32ビットに収まらない場合、
	// CompressedSizeは^uint32(0)に設定されます。
	//
	// Deprecated: 代わりにUncompressedSize64を使用してください。
	UncompressedSize uint32

	// CompressedSize64は、ファイルの圧縮サイズ(バイト単位)です。
	CompressedSize64 uint64

	// UncompressedSize64は、ファイルの非圧縮サイズ(バイト単位)です。
	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) AddFS added in v1.22.0

func (w *Writer) AddFS(fsys fs.FS) error

AddFS adds the files from fs.FS to the archive. It walks the directory tree starting at the root of the filesystem adding each file to the zip using deflate while maintaining the directory structure.

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:)または先頭のスラッシュで始まることはできず、 スラッシュのみが許可されます。 ファイルではなくディレクトリを作成するには、名前の末尾にスラッシュを追加します。 次の Writer.CreateWriter.CreateHeader 、または Writer.Close を呼び出す前に、ファイルの内容を io.Writer に書き込む必要があります。

func (*Writer) CreateHeader

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

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

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

func (*Writer) CreateRaw added in v1.17.0

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

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

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 は、中央ディレクトリのコメントフィールドを設定します。 Writer.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