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