非常教程

Go参考手册

档案 | archive

archive/zip

  • import "archive/zip"
  • 概述
  • 索引
  • 例子

概述

Zip 压缩包提供了对读取和写入 ZIP 压缩文件的支持。

请参阅:https://www.pkware.com/appnote

该软件包不支持磁盘跨越。

有关 ZIP64 的说明:

为了向后兼容,FileHeader 具有32位和64位大小字段。64位字段将始终包含正确的值,对于普通存档,这两个字段(32和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(查看源代码)

func RegisterCompressor(method uint16, comp Compressor)

RegisterCompressor 为指定的方法ID注册自定义压缩器。内置常用方法 Store 和 Deflate 。

func RegisterDecompressor(查看源代码)

func RegisterDecompressor(method uint16, dcomp Decompressor)

RegisterDecompressor 允许为指定的方法ID定制解压缩器。内置常用方法 Store 和 Deflate 。

type CompressorSource

Compressor 返回一个新的压缩写入器,写入 w。必须使用WriteCloser 的 Close 方法将未处理的数据刷新到w。Compressor 本身必须可以安全地从多个 goroutine 同时调用,但每个返回的作者一次只能由一个 goroutine 使用。

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

type Decompressor(查看源代码)

解压缩器返回一个新的解压缩读取器,从 r 读取。 ReadCloser 的 Close 方法必须用于释放相关资源。解压缩器本身必须可以安全地从多个 goroutine 同时调用,但每个返回的读取器一次只能由一个 goroutine 使用。

type Decompressor func(r io.Reader) io.ReadCloser

type File(查看源代码)

type File struct {
        FileHeader
        // 包含过滤或未导出的字段
}

func (*File) DataOffset(查看源代码)

func (f *File) DataOffset() (offset int64, err error)

DataOffset 返回文件的可能压缩数据,相对于 zip 文件开头的偏移量。

大多数调用者应该使用 Open ,这会透明地解压缩数据并验证校验和。

func (*File) Open(查看源代码)

func (f *File) Open() (io.ReadCloser, error)

Open 返回一个 ReadCloser ,它提供对文件内容的访问。可以同时读取多个文件。

type FileHeader(查看源代码)

FileHeader 描述了一个 zip 文件中的文件。有关详细信息,请参阅 zip 规范。

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(查看源代码)

func FileInfoHeader(fi os.FileInfo) (*FileHeader, error)

FileInfoHeader 从 os.FileInfo 创建一个部分填充的FileHeader 。因为 os.FileInfo 的 Name 方法仅返回它描述的文件的基本名称,所以可能需要修改返回的头的 Name 字段以提供文件的完整路径名。

func (*FileHeader) FileInfo(查看源代码)

func (h *FileHeader) FileInfo() os.FileInfo

FileInfo 为 FileHeader 返回一个os.FileInfo。

func (*FileHeader) ModTime(查看源代码)

func (h *FileHeader) ModTime() time.Time

ModTime 返回 UTC 的修改时间。分辨率是2s。

func (*FileHeader) Mode(查看源代码)

func (h *FileHeader) Mode() (mode os.FileMode)

模式返回 FileHeader 的权限和模式位。

func (*FileHeader) SetModTime(查看源代码)

func (h *FileHeader) SetModTime(t time.Time)

SetModTime 将 ModifiedTime 和 ModifiedDate 字段设置为UTC 中给定的时间。分辨率是2s。

func (*FileHeader) SetMode(查看源代码)

func (h *FileHeader) SetMode(mode os.FileMode)

SetMode 更改 FileHeader 的权限和模式位。

type ReadCloser(查看源代码)

type ReadCloser struct {
        Reader
        // 包含过滤或未导出的字段
}

func OpenReader(查看源代码)

func OpenReader(name string) (*ReadCloser, error)

OpenReader 将打开由名称指定的 Zip 文件并返回一个ReadCloser 。

func (*ReadCloser) Close(查看源代码)

func (rc *ReadCloser) Close() error

Close 关闭 Zip 文件,使其不能用于I/O。

type Reader(查看源代码)

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(查看源代码)

func NewReader(r io.ReaderAt, size int64) (*Reader, error)

NewReader 从 r 返回一个新的 Reader 读数,它被假定为具有给定的字节大小。

func (*Reader) RegisterDecompressorSource

func (z *Reader) RegisterDecompressor(method uint16, dcomp Decompressor)

RegisterDecompressor 注册或覆盖特定方法 ID 的自定义解压缩程序。如果找不到给定方法的解压缩程序,则 Reader 将默认在包级别查找解压缩程序。

type Writer(查看源代码)

Writer 实现了一个 zip 文件编写器。

type Writer struct {
        // 包含过滤或未导出的字段
}

示例

代码:

// 创建一个缓冲区来写入我们的存档。
buf := new(bytes.Buffer)

// 创建一个新的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 NewWriterSource

func NewWriter(w io.Writer) *Writer

NewWriter 返回一个新的 Writer 向w写一个zip文件。

func (*Writer) Close(查看源代码)

func (w *Writer) Close() error

关闭通过编写中央目录完成编写 zip 文件。它没有(也不能)关闭潜在的写者。

func (*Writer) Create(查看源代码)

func (w *Writer) Create(name string) (io.Writer, error)

创建使用提供的名称将文件添加到 zip 文件。它返回一个写入文件内容的 Writer。该名称必须是相对路径:不能以驱动器号(例如C:)或前导斜杠开头,并且只允许正斜杠。在下一次调用 Create,CreateHeader 或 Close之前,必须将文件的内容写入 io.Writer。

func (*Writer) CreateHeader(查看源代码)

func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error)

CreateHeader 使用提供的 FileHeader 为文件元数据添加一个文件到 zip 文件。它返回一个写入文件内容的 Writer 。

在下一次调用 Create, CreateHeader 或 Close 之前,必须将文件的内容写入 io.Writer。在调用 CreateHeader 之后,不得修改提供的 FileHeader fh。

func (*Writer) Flush(查看源代码)

func (w *Writer) Flush() error

刷新将任何缓冲的数据刷新到底层写入器。调用刷新通常不是必需的;调用 Close 就足够了。

func (*Writer) RegisterCompressor(查看源代码)

func (w *Writer) RegisterCompressor(method uint16, comp Compressor)

RegisterCompressor 为特定方法 ID 注册或覆盖自定义压缩器。如果没有找到给定方法的压缩器,Writer 将默认在包装级查找压缩器。

示例

package main

import (
	"archive/zip"
	"bytes"
	"compress/flate"
	"io"
)

func main() {
	// 用较高的压缩级别覆盖默认的Deflate压缩器。

	// 创建一个缓冲区来写入我们的存档。
	buf := new(bytes.Buffer)

	// 创建一个新的zip存档。
	w := zip.NewWriter(buf)

	// 注册一个自定义的Deflate压缩机。
	w.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {
		return flate.NewWriter(out, flate.BestCompression)
	})

	// 继续向w添加文件。
}

func (*Writer) SetOffset(查看源文件)

func (w *Writer) SetOffset(n int64)

SetOffset 设置底层编写器中压缩数据开始的偏移量。应将zip数据附加到现有文件(例如二进制可执行文件)时使用,且必须在写入任何数据之前调用。

档案 | archive相关

Go

Go 是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

主页 https://golang.org/
源码 https://go.googlesource.com/go
发布版本 1.9.2

Go目录

1.档案 | archive
2.缓冲区 | bufio
3.内置 | builtin
4.字节 | bytes
5.压缩 | compress
6.容器 | container
7.上下文 | context
8.加密 | crypto
9.数据库 | database
10.调试 | debug
11.编码 | encoding
12.错误 | errors
13. expvar
14.flag
15. fmt
16. go
17.散列 | hash
18.html
19.图像 | image
20.索引 | index
21.io
22.日志 | log
23.数学 | math
24. math/big
25.math/bits
26.math/cmplx
27.math/rand
28.拟态 | mime
29.net
30.net/http
31. net/mail
32. net/rpc
33.net/smtp
34. net/textproto
35. net/url
36.os
37.路径 | path
38.插件 | plugin
39.反射 | reflect
40.正则表达式 | regexp
41.运行时 | runtime
42.排序算法 | sort
43.转换 | strconv
44.字符串 | strings
45.同步 | sync
46.系统调用 | syscall
47.测试 | testing
48.文本 | text
49.时间戳 | time
50.unicode
51.不安全性 | unsafe
52.Go 语言数据类型
53.Go 语言基础语法
54.Go 语言结构
55.Go 语言 select 语句
56.Go 语言 switch 语句
57.Go 语言 if 语句嵌套
58.Go 语言 if…else 语句
59.Go 语言 if 语句
60.Go 语言运算符
61.Go 语言常量
62.Go 语言函数闭包
63.Go 语言函数作为实参
64.Go 语言函数引用传递值
65.Go 语言函数值传递值
66.Go 语言函数
67.Go 语言 goto 语句
68.Go 语言 continue 语句
69.Go 语言 break 语句
70.Go 语言循环嵌套
71.Go 语言 for 循环
72.Go 语言结构体
73.Go 语言指针作为函数参数
74.Go 语言指向指针的指针
75.Go 语言指针数组
76.Go 语言指针
77.Go 语言向函数传递数组
78.Go 语言多维数组
79.Go 语言变量作用域
80.Go 语言函数方法
81.Go 错误处理
82.Go 语言接口
83.Go 语言类型转换
84.Go 语言递归函数
85.Go 语言Map(集合)
86.Go 语言范围(Range)
87.Go 语言切片(Slice)
88.Go 并发
89.Go fmt.Sprintf 格式化字符串