?
This document uses PHP Chinese website manual Release
import "archive/zip"
概述
索引
例子
Zip 壓縮包提供了對讀取和寫入 ZIP 壓縮文件的支持。
請參閱:https://www.pkware.com/appnote
該軟件包不支持磁盤跨越。
有關 ZIP64 的說明:
為了向后兼容,F(xiàn)ileHeader 具有32位和64位大小字段。64位字段將始終包含正確的值,對于普通存檔,這兩個字段都是相同的。對于需要 ZIP64 格式的文件,32位字段將為0xffffffff,必須使用64位字段。
Constants
Variables
func RegisterCompressor(method uint16, comp Compressor)
func RegisterDecompressor(method uint16, dcomp Decompressor)
type Compressor
type Decompressor
type File
func (f *File) DataOffset() (offset int64, err error)
func (f *File) Open() (io.ReadCloser, error)
type FileHeader
func FileInfoHeader(fi os.FileInfo) (*FileHeader, error)
func (h *FileHeader) FileInfo() os.FileInfo
func (h *FileHeader) ModTime() time.Time
func (h *FileHeader) Mode() (mode os.FileMode)
func (h *FileHeader) SetModTime(t time.Time)
func (h *FileHeader) SetMode(mode os.FileMode)
type ReadCloser
func OpenReader(name string) (*ReadCloser, error)
func (rc *ReadCloser) Close() error
type Reader
func NewReader(r io.ReaderAt, size int64) (*Reader, error)
func (z *Reader) RegisterDecompressor(method uint16, dcomp Decompressor)
type Writer
func NewWriter(w io.Writer) *Writer
func (w *Writer) Close() error
func (w *Writer) Create(name string) (io.Writer, error)
func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error)
func (w *Writer) Flush() error
func (w *Writer) RegisterCompressor(method uint16, comp Compressor)
func (w *Writer) SetOffset(n int64)
Reader
Writer
Writer.RegisterCompressor
reader.go register.go struct.go writer.go
壓縮方法。
const ( Store uint16 = 0 Deflate uint16 = 8)
var ( ErrFormat = errors.New("zip: not a valid zip file") ErrAlgorithm = errors.New("zip: unsupported compression algorithm") ErrChecksum = errors.New("zip: checksum error"))
func RegisterCompressor(method uint16, comp Compressor)
RegisterCompressor 為指定的方法ID注冊自定義壓縮器。內置常用方法 Store 和 Deflate 。
func RegisterDecompressor(method uint16, dcomp Decompressor)
RegisterDecompressor 允許為指定的方法ID定制解壓縮器。內置常用方法 Store 和 Deflate 。
Compressor 返回一個新的壓縮作家,寫入 w。必須使用WriteCloser 的 Close 方法將未處理的數(shù)據(jù)刷新到w。Compressor 本身必須可以安全地從多個 goroutine 同時調用,但每個返回的作者一次只能由一個 goroutine 使用。
type Compressor func(w io.Writer) (io.WriteCloser, error)
解壓縮器返回一個新的解壓縮讀取器,從 r 讀取。 ReadCloser 的 Close 方法必須用于釋放相關資源。解壓縮器本身必須可以安全地從多個 goroutine 同時調用,但每個返回的讀取器一次只能由一個 goroutine 使用。
type Decompressor func(r io.Reader) io.ReadCloser
type File struct { FileHeader // 包含過濾或未導出的字段}
func (f *File) DataOffset() (offset int64, err error)
DataOffset 返回文件的可能壓縮數(shù)據(jù),相對于 zip 文件開頭的偏移量。
大多數(shù)調用者應該使用 Open ,這會透明地解壓縮數(shù)據(jù)并驗證校驗和。
func (f *File) Open() (io.ReadCloser, error)
Open 返回一個 ReadCloser ,它提供對文件內容的訪問??梢酝瑫r讀取多個文件。
FileHeader 描述了一個 zip 文件中的文件。有關詳細信息,請參閱 zip 規(guī)范。
type FileHeader struct { // 名稱是文件的名稱。 // 它必須是相對路徑:它不能以驅動器啟動 // 字母(例如C:)或前導斜線,并且只有正斜杠 // 允許。 Name string CreatorVersion uint16 ReaderVersion uint16 Flags uint16 Method uint16 ModifiedTime uint16 // MS-DOS time ModifiedDate uint16 // MS-DOS date CRC32 uint32 CompressedSize uint32 // 棄用:改用CompressedSize64。 UncompressedSize uint32 // 棄用:改用UncompressedSize64。 CompressedSize64 uint64 UncompressedSize64 uint64 Extra []byte ExternalAttrs uint32 // 含義取決于Creator版本 Comment string}
func FileInfoHeader(fi os.FileInfo) (*FileHeader, error)
FileInfoHeader 從 os.FileInfo 創(chuàng)建一個部分填充的FileHeader 。因為 os.FileInfo 的 Name 方法僅返回它描述的文件的基本名稱,所以可能需要修改返回的頭的 Name 字段以提供文件的完整路徑名。
func (h *FileHeader) FileInfo() os.FileInfo
FileInfo 為 FileHeader 返回一個os.FileInfo。
func (h *FileHeader) ModTime() time.Time
ModTime 返回 UTC 的修改時間。分辨率是2s。
func (h *FileHeader) Mode() (mode os.FileMode)
模式返回 FileHeader 的權限和模式位。
func (h *FileHeader) SetModTime(t time.Time)
SetModTime 將 ModifiedTime 和 ModifiedDate 字段設置為UTC 中給定的時間。分辨率是2s。
func (h *FileHeader) SetMode(mode os.FileMode)
SetMode 更改 FileHeader 的權限和模式位。
type ReadCloser struct { Reader // 包含過濾或未導出的字段}
func OpenReader(name string) (*ReadCloser, error)
OpenReader 將打開由名稱指定的 Zip 文件并返回一個ReadCloser 。
func (rc *ReadCloser) Close() error
Close 關閉 Zip 文件,使其不能用于I/O。
type Reader struct { File []*File Comment string // 包含過濾或未導出的字段}
代碼:
// 打開一個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()}
輸出:
Contents of README:This is the source code repository for the Go programming language.
func NewReader(r io.ReaderAt, size int64) (*Reader, error)
NewReader 從 r 返回一個新的 Reader 讀數(shù),它被假定為具有給定的字節(jié)大小。
func (z *Reader) RegisterDecompressor(method uint16, dcomp Decompressor)
RegisterDecompressor 注冊或覆蓋特定方法 ID 的自定義解壓縮程序。如果找不到給定方法的解壓縮程序,則 Reader 將默認在包級別查找解壓縮程序。
Writer 實現(xiàn)了一個 zip 文件編寫器。
type Writer struct { // 包含過濾或未導出的字段}
代碼:
// 創(chuàng)建一個緩沖區(qū)來寫入我們的存檔。buf := new(bytes.Buffer)// 創(chuàng)建一個新的zip存檔。w := zip.NewWriter(buf)// 將一些文件添加到存檔中。將一些文件添加到存檔中。var files = []struct { Name, Body string}{ {"readme.txt", "This archive contains some text files."}, {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, {"todo.txt", "Get animal handling licence.\nWrite more examples."},}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)}
func NewWriter(w io.Writer) *Writer
NewWriter 返回一個新的 Writer 向w寫一個zip文件。
func (w *Writer) Close() error
關閉通過編寫中央目錄完成編寫 zip 文件。它沒有(也不能)關閉潛在的寫者。
func (w *Writer) Create(name string) (io.Writer, error)
創(chuàng)建使用提供的名稱將文件添加到 zip 文件。它返回一個寫入文件內容的 Writer。該名稱必須是相對路徑:不能以驅動器號(例如C:)或前導斜杠開頭,并且只允許正斜杠。在下一次調用 Create,CreateHeader 或 Close之前,必須將文件的內容寫入 io.Writer。
func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error)
CreateHeader 使用提供的 FileHeader 為文件元數(shù)據(jù)添加一個文件到 zip 文件。它返回一個寫入文件內容的 Writer 。
在下一次調用 Create, CreateHeader 或 Close 之前,必須將文件的內容寫入 io.Writer。在調用 CreateHeader 之后,不得修改提供的 FileHeader fh。
func (w *Writer) Flush() error
刷新將任何緩沖的數(shù)據(jù)刷新到底層寫入器。調用刷新通常不是必需的;調用 Close 就足夠了。
func (w *Writer) RegisterCompressor(method uint16, comp Compressor)
RegisterCompressor 為特定方法 ID 注冊或覆蓋自定義壓縮器。如果沒有找到給定方法的壓縮器,Writer 將默認在包裝級查找壓縮器。
package mainimport ("archive/zip""bytes""compress/flate""io")func main() {// 用較高的壓縮級別覆蓋默認的Deflate壓縮器。// 創(chuàng)建一個緩沖區(qū)來寫入我們的存檔。 buf := new(bytes.Buffer)// 創(chuàng)建一個新的zip存檔。 w := zip.NewWriter(buf)// 注冊一個自定義的Deflate壓縮機。 w.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {return flate.NewWriter(out, flate.BestCompression)})// 繼續(xù)向w添加文件。}
func (w *Writer) SetOffset(n int64)
SetOffset 設置底層編寫器中壓縮數(shù)據(jù)開始的偏移量。應將zip數(shù)據(jù)附加到現(xiàn)有文件(例如二進制可執(zhí)行文件)時使用,且必須在寫入任何數(shù)據(jù)之前調用。