# package zip
`import "archive/zip"`
zip包提供了zip檔案文件的讀寫服務。參見[http://www.pkware.com/documents/casestudies/APPNOTE.TXT](http://www.pkware.com/documents/casestudies/APPNOTE.TXT)
本包不支持跨硬盤的壓縮。
關于ZIP64:
為了向下兼容,FileHeader同時擁有32位和64位的Size字段。64位字段總是包含正確的值,對普通格式的檔案未見它們的值是相同的。對zip64格式的檔案文件32位字段將是0xffffffff,必須使用64位字段。
## Index
* [Constants](#pkg-constants)
* [Variables](#pkg-variables)
* [type Compressor](#Compressor)
* [type Decompressor](#Decompressor)
* [func RegisterCompressor(method uint16, comp Compressor)](#RegisterCompressor)
* [func RegisterDecompressor(method uint16, d Decompressor)](#RegisterDecompressor)
* [type FileHeader](#FileHeader)
* [func FileInfoHeader(fi os.FileInfo) (\*FileHeader, error)](#FileInfoHeader)
* [func (h \*FileHeader) FileInfo() os.FileInfo](#FileHeader.FileInfo)
* [func (h \*FileHeader) Mode() (mode os.FileMode)](#FileHeader.Mode)
* [func (h \*FileHeader) SetMode(mode os.FileMode)](#FileHeader.SetMode)
* [func (h \*FileHeader) ModTime() time.Time](#FileHeader.ModTime)
* [func (h \*FileHeader) SetModTime(t time.Time)](#FileHeader.SetModTime)
* [type File](#File)
* [func (f \*File) DataOffset() (offset int64, err error)](#File.DataOffset)
* [func (f \*File) Open() (rc io.ReadCloser, err error)](#File.Open)
* [type Reader](#Reader)
* [func NewReader(r io.ReaderAt, size int64) (\*Reader, error)](#NewReader)
* [type ReadCloser](#ReadCloser)
* [func OpenReader(name string) (\*ReadCloser, error)](#OpenReader)
* [func (rc \*ReadCloser) Close() error](#ReadCloser.Close)
* [type Writer](#Writer)
* [func NewWriter(w io.Writer) \*Writer](#NewWriter)
* [func (w \*Writer) CreateHeader(fh \*FileHeader) (io.Writer, error)](#Writer.CreateHeader)
* [func (w \*Writer) Create(name string) (io.Writer, error)](#Writer.Create)
* [func (w \*Writer) Close() error](#Writer.Close)
### Examples
* [Reader](#example-Reader)
* [Writer](#example-Writer)
## Constants
```
const (
Store uint16 = 0
Deflate uint16 = 8
)
```
預定義壓縮算法。
## Variables
```
var (
ErrFormat = errors.New("zip: not a valid zip file")
ErrAlgorithm = errors.New("zip: unsupported compression algorithm")
ErrChecksum = errors.New("zip: checksum error")
)
```
## type [Compressor](https://github.com/golang/go/blob/master/src/archive/zip/register.go#L17 "View Source")
```
type Compressor func(io.Writer) (io.WriteCloser, error)
```
Compressor函數類型會返回一個io.WriteCloser,該接口會將數據壓縮后寫入提供的接口。關閉時,應將緩沖中的數據刷新到下層接口中。
## type [Decompressor](https://github.com/golang/go/blob/master/src/archive/zip/register.go#L23 "View Source")
```
type Decompressor func(io.Reader) io.ReadCloser
```
Decompressor函數類型會返回一個io.ReadCloser,?該接口的Read方法會將讀取自提供的接口的數據提前解壓縮。程序員有責任在讀取結束時關閉該io.ReadCloser。
## func [RegisterCompressor](https://github.com/golang/go/blob/master/src/archive/zip/register.go#L90 "View Source")
```
func RegisterCompressor(method uint16, comp Compressor)
```
RegisterCompressor使用指定的方法ID注冊一個Compressor類型函數。常用的方法Store和Deflate是內建的。
## func [RegisterDecompressor](https://github.com/golang/go/blob/master/src/archive/zip/register.go#L78 "View Source")
```
func RegisterDecompressor(method uint16, d Decompressor)
```
RegisterDecompressor使用指定的方法ID注冊一個Decompressor類型函數。
## type [FileHeader](https://github.com/golang/go/blob/master/src/archive/zip/struct.go#L70 "View Source")
```
type FileHeader struct {
// Name是文件名,它必須是相對路徑,不能以設備或斜杠開始,只接受'/'作為路徑分隔符
Name string
CreatorVersion uint16
ReaderVersion uint16
Flags uint16
Method uint16
ModifiedTime uint16 // MS-DOS時間
ModifiedDate uint16 // MS-DOS日期
CRC32 uint32
CompressedSize uint32 // 已棄用;請使用CompressedSize64
UncompressedSize uint32 // 已棄用;請使用UncompressedSize64
CompressedSize64 uint64
UncompressedSize64 uint64
Extra []byte
ExternalAttrs uint32 // 其含義依賴于CreatorVersion
Comment string
}
```
FileHeader描述zip文件中的一個文件。參見zip的定義獲取細節。
### func [FileInfoHeader](https://github.com/golang/go/blob/master/src/archive/zip/struct.go#L120 "View Source")
```
func FileInfoHeader(fi os.FileInfo) (*FileHeader, error)
```
FileInfoHeader返回一個根據fi填寫了部分字段的Header。因為os.FileInfo接口的Name方法只返回它描述的文件的無路徑名,有可能需要將返回值的Name字段修改為文件的完整路徑名。
### func (\*FileHeader) [FileInfo](https://github.com/golang/go/blob/master/src/archive/zip/struct.go#L94 "View Source")
```
func (h *FileHeader) FileInfo() os.FileInfo
```
FileInfo返回一個根據h的信息生成的os.FileInfo。
### func (\*FileHeader) [Mode](https://github.com/golang/go/blob/master/src/archive/zip/struct.go#L209 "View Source")
```
func (h *FileHeader) Mode() (mode os.FileMode)
```
Mode返回h的權限和模式位。
### func (\*FileHeader) [SetMode](https://github.com/golang/go/blob/master/src/archive/zip/struct.go#L223 "View Source")
```
func (h *FileHeader) SetMode(mode os.FileMode)
```
SetMode修改h的權限和模式位。
### func (\*FileHeader) [ModTime](https://github.com/golang/go/blob/master/src/archive/zip/struct.go#L179 "View Source")
```
func (h *FileHeader) ModTime() time.Time
```
返回最近一次修改的UTC時間。(精度2s)
### func (\*FileHeader) [SetModTime](https://github.com/golang/go/blob/master/src/archive/zip/struct.go#L185 "View Source")
```
func (h *FileHeader) SetModTime(t time.Time)
```
將ModifiedTime和ModifiedDate字段設置為給定的UTC時間。(精度2s)
## type [File](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L34 "View Source")
```
type File struct {
FileHeader
// 內含隱藏或非導出字段
}
```
### func (\*File) [DataOffset](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L122 "View Source")
```
func (f *File) DataOffset() (offset int64, err error)
```
DataOffset返回文件的可能存在的壓縮數據相對于zip文件起始的偏移量。大多數調用者應使用Open代替,該方法會主動解壓縮數據并驗證校驗和。
### func (\*File) [Open](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L132 "View Source")
```
func (f *File) Open() (rc io.ReadCloser, err error)
```
Open方法返回一個io.ReadCloser接口,提供讀取文件內容的方法。可以同時讀取多個文件。
## type [Reader](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L23 "View Source")
```
type Reader struct {
File []*File
Comment string
// 內含隱藏或非導出字段
}
```
Example
```
// Open a zip archive for reading.
r, err := zip.OpenReader("testdata/readme.zip")
if err != nil {
log.Fatal(err)
}
defer r.Close()
// Iterate through the files in the archive,
// printing some of their contents.
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()
}
```
Output:
```
Contents of README:
This is the source code repository for the Go programming language.
```
### func [NewReader](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L67 "View Source")
```
func NewReader(r io.ReaderAt, size int64) (*Reader, error)
```
NewReader返回一個從r讀取數據的\*Reader,r被假設其大小為size字節。
## type [ReadCloser](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L29 "View Source")
```
type ReadCloser struct {
Reader
// 內含隱藏或非導出字段
}
```
### func [OpenReader](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L46 "View Source")
```
func OpenReader(name string) (*ReadCloser, error)
```
OpenReader會打開name指定的zip文件并返回一個\*ReadCloser。
### func (\*ReadCloser) [Close](https://github.com/golang/go/blob/master/src/archive/zip/reader.go#L113 "View Source")
```
func (rc *ReadCloser) Close() error
```
Close關閉zip文件,使它不能用于I/O。
## type [Writer](https://github.com/golang/go/blob/master/src/archive/zip/writer.go#L20 "View Source")
```
type Writer struct {
// 內含隱藏或非導出字段
}
```
Writer類型實現了zip文件的寫入器。
Example
```
// Create a buffer to write our archive to.
buf := new(bytes.Buffer)
// Create a new zip archive.
w := zip.NewWriter(buf)
// Add some files to the archive.
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)
}
}
// Make sure to check the error on Close.
err := w.Close()
if err != nil {
log.Fatal(err)
}
```
### func [NewWriter](https://github.com/golang/go/blob/master/src/archive/zip/writer.go#L33 "View Source")
```
func NewWriter(w io.Writer) *Writer
```
NewWriter創建并返回一個將zip文件寫入w的\*Writer。
### func (\*Writer) [CreateHeader](https://github.com/golang/go/blob/master/src/archive/zip/writer.go#L183 "View Source")
```
func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error)
```
使用給出的\*FileHeader來作為文件的元數據添加一個文件進zip文件。本方法返回一個io.Writer接口(用于寫入新添加文件的內容)。新增文件的內容必須在下一次調用CreateHeader、Create或Close方法之前全部寫入。
### func (\*Writer) [Create](https://github.com/golang/go/blob/master/src/archive/zip/writer.go#L170 "View Source")
```
func (w *Writer) Create(name string) (io.Writer, error)
```
使用給出的文件名添加一個文件進zip文件。本方法返回一個io.Writer接口(用于寫入新添加文件的內容)。文件名必須是相對路徑,不能以設備或斜杠開始,只接受'/'作為路徑分隔。新增文件的內容必須在下一次調用CreateHeader、Create或Close方法之前全部寫入。
### func (\*Writer) [Close](https://github.com/golang/go/blob/master/src/archive/zip/writer.go#L39 "View Source")
```
func (w *Writer) Close() error
```
Close方法通過寫入中央目錄關閉該\*Writer。本方法不會也沒辦法關閉下層的io.Writer接口。
- 庫
- package achive
- package tar
- package zip
- package bufio
- package builtin
- package bytes
- package compress
- package bzip2
- package flate
- package gzip
- package lzw
- package zlib
- package container
- package heap
- package list
- package ring
- package crypto
- package aes
- package cipher
- package des
- package dsa
- package ecdsa
- package elliptic
- package hmac
- package md5
- package rand
- package rc4
- package rsa
- package sha1
- package sha256
- package sha512
- package subtle
- package tls
- package x509
- package pkix
- package database
- package sql
- package driver
- package encoding
- package ascii85
- package asn1
- package base32
- package base64
- package binary
- package csv
- package gob
- package hex
- package json
- package pem
- package xml
- package errors
- package expvar
- package flag
- package fmt
- package go
- package doc
- package format
- package parser
- package printer
- package hash
- package adler32
- package crc32
- package crc64
- package fnv
- package html
- package template
- package image
- package color
- package palette
- package draw
- package gif
- package jpeg
- package png
- package index
- package suffixarray
- package io
- package ioutil
- package log
- package syslog
- package math
- package big
- package cmplx
- package rand
- package mime
- package multipart
- package net
- package http
- package cgi
- package cookiejar
- package fcgi
- package httptest
- package httputil
- package pprof
- package mail
- package rpc
- package jsonrpc
- package smtp
- package textproto
- package url
- package os
- package exec
- package signal
- package user
- package path
- package filepath
- package reflect
- package regexp
- package runtime
- package cgo
- package debug
- package pprof
- package race
- package sort
- package strconv
- package strings
- package sync
- package atomic
- package text
- package scanner
- package tabwriter
- package template
- package time
- package unicode
- package utf16
- package utf8
- package unsafe