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 を呼び出す前にのみ呼び出すことができます。