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)