github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/archive/zip/writer.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package zip 6 7 import ( 8 "github.com/shogo82148/std/io" 9 "github.com/shogo82148/std/io/fs" 10 ) 11 12 type ( 13 countWriter struct{} 14 header struct{} 15 fileWriter struct{} 16 ) 17 18 // Writer は、ZIP ファイルのライターを実装します。 19 type Writer struct { 20 cw *countWriter 21 dir []*header 22 last *fileWriter 23 closed bool 24 compressors map[uint16]Compressor 25 comment string 26 27 // testHookCloseSizeOffset if non-nil is called with the size 28 // of offset of the central directory at Close. 29 testHookCloseSizeOffset func(size, offset uint64) 30 } 31 32 // NewWriter は、w に ZIP ファイルを書き込む新しい [Writer] を返します。 33 func NewWriter(w io.Writer) *Writer 34 35 // SetOffset は、zip データの開始オフセットを基になるライター内に設定します。 36 // これは、バイナリ実行可能ファイルなどに zip データが追加される場合に使用する必要があります。 37 // データが書き込まれる前に呼び出す必要があります。 38 func (w *Writer) SetOffset(n int64) 39 40 // Flush は、バッファリングされたデータを基になるライターにフラッシュします。 41 // Flush を呼び出す必要は通常ありません。Close を呼び出すだけで十分です。 42 func (w *Writer) Flush() error 43 44 // SetComment は、中央ディレクトリのコメントフィールドを設定します。 45 // [Writer.Close] を呼び出す前にのみ呼び出すことができます。 46 func (w *Writer) SetComment(comment string) error 47 48 // Close は、中央ディレクトリを書き込むことで zip ファイルの書き込みを終了します。 49 // 基になるライターを閉じません。 50 func (w *Writer) Close() error 51 52 // Create は、指定された名前を使用してファイルを zip ファイルに追加します。 53 // 返される [Writer] にファイルの内容を書き込む必要があります。 54 // ファイルの内容は、 [Deflate] メソッドを使用して圧縮されます。 55 // 名前は相対パスである必要があります。 56 // ドライブレター(例:C:)または先頭のスラッシュで始まることはできず、 57 // スラッシュのみが許可されます。 58 // ファイルではなくディレクトリを作成するには、名前の末尾にスラッシュを追加します。 59 // 次の [Writer.Create] 、 [Writer.CreateHeader] 、または [Writer.Close] を呼び出す前に、ファイルの内容を [io.Writer] に書き込む必要があります。 60 func (w *Writer) Create(name string) (io.Writer, error) 61 62 // CreateHeader は、ファイルメタデータに提供された [FileHeader] を使用して、zip アーカイブにファイルを追加します。 63 // [Writer] は fh を所有し、そのフィールドを変更する可能性があります。 64 // [Writer.CreateHeader] を呼び出した後、呼び出し元は fh を変更してはいけません。 65 // 66 // これは、ファイルの内容を書き込む必要がある [Writer] を返します。 67 // 次の [Writer.Create] 、 [Writer.CreateHeader] 、 [Writer.CreateRaw] 、または [Writer.Close] を呼び出す前に、ファイルの内容を [io.Writer] に書き込む必要があります。 68 func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error) 69 70 // CreateRaw は、提供された [FileHeader] を使用して zip アーカイブにファイルを追加し、 71 // ファイルの内容を書き込むための [Writer] を返します。 72 // 次の [Writer.Create] 、 [Writer.CreateHeader] 、 [Writer.CreateRaw] 、または [Writer.Close] を呼び出す前に、ファイルの内容を [io.Writer] に書き込む必要があります。 73 // 74 // [Writer.CreateHeader] とは異なり、Writer に渡されるバイトは圧縮されません。 75 // 76 // CreateRawの引数はwに格納されます。引数がメモリ内のデータから作成された [Reader] から取得した 77 // [File] 内の埋め込まれた [FileHeader] へのポインタである場合、wはそのメモリ全体を参照します。 78 func (w *Writer) CreateRaw(fh *FileHeader) (io.Writer, error) 79 80 // Copy は、ファイル f( [Reader] から取得された)を w にコピーします。 81 // これは、解凍、圧縮、および検証をバイパスして、生の形式で直接コピーします。 82 func (w *Writer) Copy(f *File) error 83 84 // RegisterCompressor は、特定のメソッド ID にカスタムの圧縮プログラムを登録または上書きします。 85 // メソッドの圧縮プログラムが見つからない場合、 [Writer] はパッケージレベルで圧縮プログラムを検索します。 86 func (w *Writer) RegisterCompressor(method uint16, comp Compressor) 87 88 // AddFSは、fs.FSからのファイルをアーカイブに追加します。 89 // ファイルシステムのルートから始まるディレクトリツリーを走査し、 90 // ディレクトリ構造を維持しながら、各ファイルをdeflateを使用してzipに追加します。 91 func (w *Writer) AddFS(fsys fs.FS) error