Documentation
¶
Overview ¶
zipパッケージは、ZIP アーカイブの読み書きをサポートします。
詳細については、ZIP specification を参照してください。
このパッケージはディスクスパニングをサポートしていません。
ZIP64 についての注意点:
後方互換性を保つために、FileHeader には 32 ビットと 64 ビットの両方の Size フィールドがあります。 64 ビットフィールドには常に正しい値が含まれ、通常のアーカイブでは両方のフィールドが同じ値になります。 ZIP64 形式が必要なファイルの場合、32 ビットフィールドは 0xffffffff になり、代わりに 64 ビットフィールドを使用する必要があります。
Index ¶
- Constants
- Variables
- func RegisterCompressor(method uint16, comp Compressor)
- func RegisterDecompressor(method uint16, dcomp Decompressor)
- type Compressor
- type Decompressor
- type File
- type FileHeader
- type ReadCloser
- type Reader
- type Writer
- func (w *Writer) AddFS(fsys fs.FS) error
- func (w *Writer) Close() error
- func (w *Writer) Copy(f *File) error
- func (w *Writer) Create(name string) (io.Writer, error)
- func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error)
- func (w *Writer) CreateRaw(fh *FileHeader) (io.Writer, error)
- func (w *Writer) Flush() error
- func (w *Writer) RegisterCompressor(method uint16, comp Compressor)
- func (w *Writer) SetComment(comment string) error
- func (w *Writer) SetOffset(n int64)
Examples ¶
Constants ¶
const ( Store uint16 = 0 Deflate uint16 = 8 )
圧縮方式
Variables ¶
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 から読み取る新しい解凍リーダーを返します。 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
DataOffset は、ファイルの圧縮された可能性のあるデータのオフセットを、zip ファイルの先頭からの相対位置で返します。
ほとんどの呼び出し元は、データを透過的に解凍し、チェックサムを検証する File.Open を代わりに使用する必要があります。
func (*File) Open ¶
func (f *File) Open() (io.ReadCloser, error)
Open は、ファイルの内容にアクセスする ReadCloser を返します。 複数の File を同時に読み取ることができます。
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ビットに収まらない場合、
// UncompressedSizeは^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 エラーを無視して返されたリーダーを使用できます。
type Reader ¶
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 ¶
NewReader は、指定されたサイズを持つと想定される r から読み取る新しい Reader を返します。
アーカイブ内のファイルのいずれかが、[filepath.IsLocal] によって定義されるローカルでない名前 またはバックスラッシュを含む名前を使用している場合、 および GODEBUG 環境変数に `zipinsecurepath=0` が含まれている場合、 NewReader は ErrInsecurePath エラーを返すリーダーを返します。 将来の Go のバージョンでは、この動作がデフォルトで導入される可能性があります。 ローカルでない名前を受け入れたいプログラムは、 ErrInsecurePath エラーを無視して返されたリーダーを使用できます。
func (*Reader) Open ¶ added in v1.16.0
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 (*Writer) AddFS ¶ added in v1.22.0
AddFSは、fs.FSからのファイルをアーカイブに追加します。 ファイルシステムのルートから始まるディレクトリツリーを走査し、 ディレクトリ構造を維持しながら、各ファイルをdeflateを使用してzipに追加します。
func (*Writer) Copy ¶ added in v1.17.0
Copy は、ファイル f( Reader から取得された)を w にコピーします。 これは、解凍、圧縮、および検証をバイパスして、生の形式で直接コピーします。
func (*Writer) Create ¶
Create は、指定された名前を使用してファイルを zip ファイルに追加します。 返される Writer にファイルの内容を書き込む必要があります。 ファイルの内容は、 Deflate メソッドを使用して圧縮されます。 名前は相対パスである必要があります。 ドライブレター(例:C:)または先頭のスラッシュで始まることはできず、 スラッシュのみが許可されます。 ファイルではなくディレクトリを作成するには、名前の末尾にスラッシュを追加します。 重複する名前は以前のエントリを上書きせず、ZIPファイルに追加されます。 次の Writer.Create 、 Writer.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.Create 、 Writer.CreateHeader 、 Writer.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.Create 、 Writer.CreateHeader 、 Writer.CreateRaw 、または Writer.Close を呼び出す前に、ファイルの内容を io.Writer に書き込む必要があります。
Writer.CreateHeader とは異なり、Writer に渡されるバイトは圧縮されません。
CreateRawの引数はwに格納されます。引数がメモリ内のデータから作成された Reader から取得した File 内の埋め込まれた FileHeader へのポインタである場合、wはそのメモリ全体を参照します。
func (*Writer) Flush ¶ added in v1.4.0
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
SetComment は、中央ディレクトリのコメントフィールドを設定します。 Writer.Close を呼び出す前にのみ呼び出すことができます。