github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/archive/zip/reader.go (about)

     1  // Copyright 2010 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/errors"
     9  	"github.com/shogo82148/std/io"
    10  	"github.com/shogo82148/std/io/fs"
    11  	"github.com/shogo82148/std/os"
    12  	"github.com/shogo82148/std/sync"
    13  )
    14  
    15  var (
    16  	ErrFormat       = errors.New("zip: not a valid zip file")
    17  	ErrAlgorithm    = errors.New("zip: unsupported compression algorithm")
    18  	ErrChecksum     = errors.New("zip: checksum error")
    19  	ErrInsecurePath = errors.New("zip: insecure file path")
    20  )
    21  
    22  type fileListEntry struct{}
    23  
    24  // Reader は、ZIP アーカイブからコンテンツを提供するための構造体です。
    25  type Reader struct {
    26  	r             io.ReaderAt
    27  	File          []*File
    28  	Comment       string
    29  	decompressors map[uint16]Decompressor
    30  
    31  	// Some JAR files are zip files with a prefix that is a bash script.
    32  	// The baseOffset field is the start of the zip file proper.
    33  	baseOffset int64
    34  
    35  	// fileList is a list of files sorted by ename,
    36  	// for use by the Open method.
    37  	fileListOnce sync.Once
    38  	fileList     []fileListEntry
    39  }
    40  
    41  // ReadCloser は、不要になったときに閉じる必要がある [Reader] です。
    42  type ReadCloser struct {
    43  	f *os.File
    44  	Reader
    45  }
    46  
    47  // File は、ZIP アーカイブ内の単一のファイルです。
    48  // ファイル情報は、埋め込み [FileHeader] にあります。
    49  // ファイルの内容は、 [File.Open] を呼び出すことでアクセスできます。
    50  type File struct {
    51  	FileHeader
    52  	zip          *Reader
    53  	zipr         io.ReaderAt
    54  	headerOffset int64
    55  	zip64        bool
    56  }
    57  
    58  // OpenReader は、指定された名前の Zip ファイルを開き、ReadCloser を返します。
    59  //
    60  // アーカイブ内のファイルのいずれかが、[filepath.IsLocal] によって定義されるローカルでない名前
    61  // またはバックスラッシュを含む名前を使用している場合、
    62  // および GODEBUG 環境変数に `zipinsecurepath=0` が含まれている場合、
    63  // OpenReader は ErrInsecurePath エラーを返すリーダーを返します。
    64  // 将来の Go のバージョンでは、この動作がデフォルトで導入される可能性があります。
    65  // ローカルでない名前を受け入れたいプログラムは、ErrInsecurePath エラーを無視して返されたリーダーを使用できます。
    66  func OpenReader(name string) (*ReadCloser, error)
    67  
    68  // NewReader は、指定されたサイズを持つと想定される r から読み取る新しい [Reader] を返します。
    69  //
    70  // アーカイブ内のファイルのいずれかが、[filepath.IsLocal] によって定義されるローカルでない名前
    71  // またはバックスラッシュを含む名前を使用している場合、
    72  // および GODEBUG 環境変数に `zipinsecurepath=0` が含まれている場合、
    73  // NewReader は [ErrInsecurePath] エラーを返すリーダーを返します。
    74  // 将来の Go のバージョンでは、この動作がデフォルトで導入される可能性があります。
    75  // ローカルでない名前を受け入れたいプログラムは、 [ErrInsecurePath] エラーを無視して返されたリーダーを使用できます。
    76  func NewReader(r io.ReaderAt, size int64) (*Reader, error)
    77  
    78  // RegisterDecompressor は、特定のメソッド ID にカスタムの解凍プログラムを登録または上書きします。
    79  // メソッドの解凍プログラムが見つからない場合、Reader はパッケージレベルで解凍プログラムを検索します。
    80  func (r *Reader) RegisterDecompressor(method uint16, dcomp Decompressor)
    81  
    82  // Close は、Zip ファイルを閉じ、I/O に使用できなくします。
    83  func (rc *ReadCloser) Close() error
    84  
    85  // DataOffset は、ファイルの圧縮された可能性のあるデータのオフセットを、zip ファイルの先頭からの相対位置で返します。
    86  //
    87  // ほとんどの呼び出し元は、データを透過的に解凍し、チェックサムを検証する [File.Open] を代わりに使用する必要があります。
    88  func (f *File) DataOffset() (offset int64, err error)
    89  
    90  // Open は、ファイルの内容にアクセスする [ReadCloser] を返します。
    91  // 複数の [File] を同時に読み取ることができます。
    92  func (f *File) Open() (io.ReadCloser, error)
    93  
    94  // OpenRawは、解凍せずに [File] の内容にアクセスを提供する [Reader] を返します。
    95  func (f *File) OpenRaw() (io.Reader, error)
    96  
    97  // Openは、fs.FS.Openのセマンティクスを使用して、ZIPアーカイブ内の指定されたファイルを開きます。
    98  // パスは常にスラッシュで区切られ、先頭に/または../要素はありません。
    99  func (r *Reader) Open(name string) (fs.File, error)