golang中archive/zip包用法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

archive/zip包提供了zip歸檔檔案的讀寫操作。

在對zip包進行介紹之前,先說明一下zip和tar的區別。

二者都是對檔案進行歸檔,不進行壓縮。並且二者使用平台不同,對於 Windows 平台而言,最常用的格式是 zip 和 rar,國內大多數是用 rar,國外大多數是用 zip。而對於類 Unix 平台而言,常用的格式是 tar 和 tar.gz,zip 比較少一些,rar 則幾乎沒有。


zip 格式是開放且免費的,所以廣泛使用在 Windows、Linux、MacOS 平台,要說 zip 有什麼缺點的話,就是它的壓縮率並不是很高,不如 rar及 tar.gz 等格式。

嚴格的說,tar 只是一種打包格式,並不對檔案進行壓縮,主要是為了便於檔案的管理,所以打包後的文檔大小一般遠遠大於 zip 和 tar.gz,但這種格式也有很明顯的優點,例如打包速度非常快,打包時 CPU 佔用率也很低,因為不需要壓縮嘛。

接下來對zip包進行講解。

zip包不支援跨硬碟進行操作為了向下相容,FileHeader同時擁有32位和64位的Size欄位。64位欄位總是包含正確的值,對普通格式的檔案未見它們的值是相同的。對zip64格式的檔案檔案32位欄位將是0xffffffff,必須使用64位欄位。

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")func_name)

func RegisterCompressor(method uint16, comp Compressor) //使用指定的方法id產生一個Compressor的類型函數。常用的方法Store和Deflate是內建的
func RegisterDecompressor(method uint16, d Decompressor)//使用指定的方法id註冊一個Decompressor類型的函數

type Compressor

type Compressor func(io.Writer) (io.WriteCloser, error)

Compressor函數類型會返回一個io.WriteCloser,該介面會將資料壓縮後寫入提供的介面。關閉時,應將緩衝中的資料寫入下層介面中。

type Decompressor

type Decompressor func(io.Reader) io.ReadCloser

Decompressor函數類型會把一個io.Reader封裝成具有decompressing特性的io.Reader.Decompressor函數類型會返回一個io.ReadCloser,該介面的Read方法會將讀取自提供的介面的資料提前解壓縮。需要在讀取結束時關閉該io.ReadCloser。

type File

type File struct {    FileHeader    // contains filtered or unexported fields}

func (f *File) DataOffset() (offset int64, err error) //DataOffset返迴文件的可能存在的壓縮資料相對於zip檔案起始的位移量。大多數調用者應使用Open代替,該方法會主動解壓縮資料並驗證校正和。
func (f *File) Open() (rc io.ReadCloser, err error) //Open方法返回一個io.ReadCloser介面,提供讀取檔案內容的方法。可以同時讀取多個檔案。


type FileHeader

type FileHeader struct {    Name string    // Name是檔案名稱,它必須是相對路徑, 不能以裝置或斜杠開始,只接受'/'作為路徑分隔字元    CreatorVersion     uint16    ReaderVersion      uint16    Flags              uint16    Method             uint16    ModifiedTime       uint16 // MS-DOS time     ModifiedDate       uint16 // MS-DOS date     CRC32              uint32    CompressedSize     uint32 // deprecated; use CompressedSize64     UncompressedSize   uint32 // deprecated; use UncompressedSize64    CompressedSize64   uint64    UncompressedSize64 uint64    Extra              []byte    ExternalAttrs      uint32 // Meaning depends on CreatorVersion     Comment            string}


func FileInfoHeader(fi os.FileInfo) (*FileHeader, error)//FileInfoHeader返回一個根據fi填寫了部分欄位的Header。因為os.FileInfo介面的Name方法只返回它描述的檔案的無路徑名,有可能需要將傳回值的Name欄位修改為檔案的完整路徑名。
func (h *FileHeader) FileInfo() os.FileInfo //FileInfo返回一個根據h的資訊產生的os.FileInfo。
func (h *FileHeader) ModTime() time.Time  //擷取最後一次修改時間
func (h *FileHeader) Mode() (mode os.FileMode)  //Mode返回h的許可權和模式位。
func (h *FileHeader) SetModTime(t time.Time)  //設定更改時間
func (h *FileHeader) SetMode(mode os.FileMode) //設定mode


舉例說明其用法

package mainimport ("archive/zip""fmt""os""time")func main() {fileinfo, err := os.Stat("../1.txt")if err != nil {fmt.Println(err)}fileheader, err := zip.FileInfoHeader(fileinfo)if err != nil {fmt.Println(err)}fmt.Println(fileheader.ModTime()) //2015-09-22 15:55:02 +0000 UTCfileheader.SetModTime(time.Now().AddDate(1, 1, 1))fmt.Println(fileheader.ModTime()) //2016-12-11 06:57:48 +0000 UTC}


type ReadCloser

type ReadCloser struct {    Reader    // contains filtered or unexported fields}
func OpenReader(name string) (*ReadCloser, error) //開啟指定名為name的zip類型的檔案,返回一個ReadCloser
func (rc *ReadCloser) Close() error //關閉ReadCloser

type Reader

type Reader struct {    File    []*File    Comment string    // contains filtered or unexported fields}


func NewReader(r io.ReaderAt, size int64) (*Reader, error) //NewReader返回一個從r讀取資料的*Reader,r被假設其大小為size位元組。


type Writer  //實現zip檔案的寫入

type Writer struct {    cw     *countWriter    dir    []*header    last   *fileWriter    closed bool    }

func NewWriter(w io.Writer) *Writer  //NewWriter建立並返回一個將zip檔案寫入w的*Writer
func (w *Writer) Close() error   //關閉writer w
func (w *Writer) Create(name string) (io.Writer, error)  //使用給出的檔案名稱添加一個檔案進zip檔案。本方法返回一個io.Writer介面(用於寫入新添加檔案的內容)。檔案名稱必須是相對路徑,不能以裝置或斜杠開始,只接受'/'作為路徑分隔。新增檔案的內容必須在下一次調用CreateHeader、Create或Close方法之前全部寫入。
func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error) //使用給出的*FileHeader來作為檔案的中繼資料添加一個檔案進zip檔案。本方法返回一個io.Writer介面(用於寫入新添加檔案的內容)。新增檔案的內容必須在下一次調用CreateHeader、Create或Close方法之前全部寫入。
func (w *Writer) Flush() error  //將緩衝中資料寫入底層io,通常情況下調用flush是沒有必要的,調用close是必要的。
func (w *Writer) SetOffset(n int64)  //該函數用來設定將zip資料寫入底層writer中的開始位移量,其經常用於將zip檔案追加到一個檔案的後面,比如將一個資料寫入一個位元據之後,該函數必須在資料寫入之前進行調用。

舉例說明zip的reader和writer用法。

package mainimport (    "archive/zip"    "fmt"    "io"    "io/ioutil"    "os"    "time")func main() {    CompressZip()   //壓縮    DeCompressZip() //解壓縮}func CompressZip() {    const dir = "../img-50/"    //擷取源檔案清單    f, err := ioutil.ReadDir(dir)    if err != nil {        fmt.Println(err)    }    fzip, _ := os.Create("img-50.zip")    w := zip.NewWriter(fzip)    defer w.Close()    for _, file := range f {        fw, _ := w.Create(file.Name())        filecontent, err := ioutil.ReadFile(dir + file.Name())        if err != nil {            fmt.Println(err)        }        n, err := fw.Write(filecontent)        if err != nil {            fmt.Println(err)        }        fmt.Println(n)    }}func DeCompressZip() {    const File = "img-50.zip"    const dir = "img/"    os.Mkdir(dir, 0777) //建立一個目錄    cf, err := zip.OpenReader(File) //讀取zip檔案    if err != nil {        fmt.Println(err)    }    defer cf.Close()    for _, file := range cf.File {        rc, err := file.Open()        if err != nil {            fmt.Println(err)        }        f, err := os.Create(dir + file.Name)        if err != nil {            fmt.Println(err)        }        defer f.Close()        n, err := io.Copy(f, rc)        if err != nil {            fmt.Println(err)        }        fmt.Println(n)    }}

參考:https://golang.org/pkg/archive/zip/

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.