...

パッケージ zip

import "archive/zip"
概要
目次

概要 ▾

zip パッケージは,ZIP アーカイブの読み書きを提供します。

https://www.pkware.com/appnote をご覧ください。

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

ZIP64 についてのメモ :

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

定数

圧縮メソッド

const (
    Store   uint16 = 0 // 圧縮なし
    Deflate uint16 = 8 // DEFLATE 圧縮
)

変数

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

func RegisterCompressor 1.2

func RegisterCompressor(method uint16, comp Compressor)

RegisterCompressor は,指定された method ID のカスタムコンプレッサを登録します。 一般的なメソッド Store と Deflate が組み込まれます。

func RegisterDecompressor 1.2

func RegisterDecompressor(method uint16, dcomp Decompressor)

RegisterDecompressor は,指定された method ID のカスタムデコンプレッサを登録します。 一般的なメソッド Store と Deflate が組み込まれます。

type Compressor 1.2

Compressor (コンプレッサ) は, w に書き込んむ新しい圧縮ライターを返します。 保留中のデータを w にフラッシュするには, WriteCloser の Close メソッドを使用する必要があります。 Compressor 自体は平行に複数のゴルーチンから呼び出しても安全ですが, 返された各ライターは一度に 1 つのゴルーチンによってのみ使用されます。

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

type Decompressor 1.2

Decompressor (デコンプレッサ, 解凍器) は, r から読み込む新しいデコンプレッサリーダーを返します。 関連付けられているリソースを解放するには, ReadCloser の Close メソッドを使用する必要があります。 Decompressor 自身は平行に複数の goroutines から起動しても安全でなければなりませんが, 返された各リーダーは一度に 1 つの goroutine によってのみ使用されます。

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

type File

type File struct {
    FileHeader
    // エクスポートされていないフィールドがあります
}

func (*File) DataOffset 1.2

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

DataOffset は, zip ファイルの先頭からの,ファイルの圧縮されているかもしれないデータのオフセットを返します。

ほとんどの呼び出し元は代わりに Open を使うべきです。 Open は透過的にデータをデコンプレスし,チェックサムを検証します。

func (*File) Open

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

Open は,ファイルの内容へのアクセスを提供する ReadCloser を返します。 複数のファイルを平行に読み取ることができます。

type FileHeader

FileHeader は, zip ファイル内のファイルを表します。 詳細は zip スペックをご覧ください。

type FileHeader struct {
    // Name はファイルの名前です。
    //
    // ドライブ文字 ("C:" など) で始まらない相対パスである必要があります。
    // また,バックスラッシュではなくフォワードスラッシュを使用する必要があります。
    // 末尾のスラッシュは,このファイルがディレクトリであることを示し,データがあってはなりません。
    //
    // zip ファイルを読み込むときは, Name フィールドに
    // zip ファイルから直接データが入力され,正確性が検証されません。
    // スラッシュの方向を正規化し,パスが相対パスであることを検証し,
    // ファイル名 ("../../../") によるパストラバーサルを防ぐなど,
    // 適切にサニタイズすることは呼び出し側の責任です。
    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 // Go 1.10

    CreatorVersion uint16
    ReaderVersion  uint16
    Flags          uint16

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

    // Modified はファイルの修正日時です。
    //
    // 読み取り時には,従来の MS-DOS の日付フィールドよりも拡張タイムスタンプが優先され,
    // タイム間のオフセットがタイムゾーンとして使用されます。
    // MS-DOS の日付のみが存在する場合,タイムゾーンは UTC と見なされます。
    //
    // 書き込み時には, (タイムゾーンに依存しない) 拡張タイムスタンプが常に発行されます。
    // 従来の MS-DOS 日付フィールドは,
    // 変更時刻の場所に従ってエンコードされています。
    Modified     time.Time // Go 1.10
    ModifiedTime uint16 // 非推奨: 従来の MS-DOS の日時。 代わりに Modified を使用してください。
    ModifiedDate uint16 // 非推奨: 従来の MS-DOS の日付。 代わりに Modified を使用してください。

    CRC32              uint32
    CompressedSize     uint32 // 非推奨: 代わりに CompressedSize64 を使用してください。
    UncompressedSize   uint32 // 非推奨: 代わりに UncompressedSize64 を使用してください。
    CompressedSize64   uint64 // Go 1.1
    UncompressedSize64 uint64 // Go 1.1
    Extra              []byte
    ExternalAttrs      uint32 // 意味は CreatorVersion に依存します
}

func FileInfoHeader

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

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

func (*FileHeader) FileInfo

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

FileInfo は, FileHeader の os.FileInfo を返します。

func (*FileHeader) ModTime

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

ModTime は,従来の ModifiedDate フィールドと ModifiedTime フィールドを使用して UTC で変更時刻を返します。

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

func (*FileHeader) Mode

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

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

func (*FileHeader) SetModTime

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

SetModTime は, Modified, ModifiedTime ,および ModifiedDate の各フィールドを, UTC で指定された時間に設定します。

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

func (*FileHeader) SetMode

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

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

type ReadCloser

type ReadCloser struct {
    Reader
    // エクスポートされていないフィールドがあります
}

func OpenReader

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

OpenReader は,name で指定された Zip ファイルを開き, ReadCloser を返します。

func (*ReadCloser) Close

func (rc *ReadCloser) Close() error

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

type Reader

type Reader struct {
    File    []*File
    Comment string
    // エクスポートされていないフィールドがあります
}

コード:

// 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()
}

出力:

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 を返します。 r は size バイトであると見なします。

func (*Reader) RegisterDecompressor 1.6

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

RegisterDecompressor は,特定の method ID のカスタムデコンプレッサを登録または上書きします。 ある method のデコンプレッサプログラムが見つからない場合, Reader はパッケージレベルにあるデコンプレッサプログラムを検索します。

type Writer

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

type Writer struct {
    // エクスポートされていないフィールドがあります
}

コード:

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

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

// アーカイブにファイルをいくつか追加します。
var files = []struct {
    Name, Body string
}{
    {"readme.txt", "This archive contains some text files."},
    {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
    {"todo.txt", "Get animal handling licence.\nWrite more examples."},
}
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)
    }
}

// 必ず閉じる時にエラーをチェックしてください。
err := w.Close()
if err != nil {
    log.Fatal(err)
}

func NewWriter

func NewWriter(w io.Writer) *Writer

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

func (*Writer) Close

func (w *Writer) Close() error

Close は,central directory (中央ディレクトリ) を書き込んで zip ファイルの書き込みを終了します。 内部のライターは閉じません。

func (*Writer) Create

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

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

func (*Writer) CreateHeader

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

CreateHeader は,ファイルメタデータ用の引数の FileHeader を使用して zip アーカイブにファイルを追加します。 ライターは fh の所有権を取得し,そのフィールドを変更するかもしれません。 呼び出し側は, CreateHeader を呼び出した後に fh を変更してはいけません。

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

func (*Writer) Flush 1.4

func (w *Writer) Flush() error

Flush (フラッシュ) は,バッファリングされているデータを内部のライターにフラッシュします。 Flush を呼び出すことは通常必要ありません。 Close を呼び出すだけで十分です。

func (*Writer) RegisterCompressor 1.6

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

RegisterCompressor は,method ID のカスタムコンプレッサを登録または上書きします。 method のコンプレッサが見つからない場合, Writer はパッケージレベルでコンプレッサを検索します。

コード:

// デフォルトの 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 にファイルを追加します。

func (*Writer) SetComment 1.10

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

SetComment (コメントを設定) は,end-of-central-directory コメントフィールドを設定します。 Close を呼び出す前にのみ呼び出すことができます。

func (*Writer) SetOffset 1.5

func (w *Writer) SetOffset(n int64)

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