非常教程

Go参考手册

档案 | archive

archive/tar

  • import "archive/tar"
  • 概述
  • 索引
  • 示例

概述

Package tar 实现对 tar 档案的访问。它的目的是去涵盖大部分的变体(variations),其中包括 GNU 和 BSD tar生成的包。

参考:

http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5
http://www.gnu.org/software/tar/manual/html_node/Standard.html
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html

示例

package main

import (
	"archive/tar"
	"bytes"
	"fmt"
	"io"
	"log"
	"os"
)

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

	// 创建一个新的tar存档。
	tw := tar.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 license."},
	}
	for _, file := range files {
		hdr := &tar.Header{
			Name: file.Name,
			Mode: 0600,
			Size: int64(len(file.Body)),
		}
		if err := tw.WriteHeader(hdr); err != nil {
			log.Fatalln(err)
		}
		if _, err := tw.Write([]byte(file.Body)); err != nil {
			log.Fatalln(err)
		}
	}
	// 确保在Close时检查错误。
	if err := tw.Close(); err != nil {
		log.Fatalln(err)
	}

	// 打开tar档案以供阅读。
	r := bytes.NewReader(buf.Bytes())
	tr := tar.NewReader(r)

	// 迭代档案中的文件。
	for {
		hdr, err := tr.Next()
		if err == io.EOF {
			// tar归档结束
			break
		}
		if err != nil {
			log.Fatalln(err)
		}
		fmt.Printf("Contents of %s:\n", hdr.Name)
		if _, err := io.Copy(os.Stdout, tr); err != nil {
			log.Fatalln(err)
		}
		fmt.Println()
	}

}

索引

  • Constants
  • Variables
  • type Header

func FileInfoHeader(fi os.FileInfo, link string) (*Header, error)

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

  • type Reader

func NewReader(r io.Reader) *Reader

func (tr *Reader) Next() (*Header, error)

func (tr *Reader) Read(b []byte) (int, error)

  • type Writer

func NewWriter(w io.Writer) *Writer

func (tw *Writer) Close() error

func (tw *Writer) Flush() error

func (tw *Writer) Write(b []byte) (n int, err error)

func (tw *Writer) WriteHeader(hdr *Header) error

示例

Package files (包文件)

common.go format.go reader.go stat_atim.go stat_unix.go strconv.go writer.go

常量

标题类型标志。

const (
        TypeReg           = '0'    // 普通文件
        TypeRegA          = '\x00' // 普通文件
        TypeLink          = '1'    // 硬链接(hard link)
        TypeSymlink       = '2'    // 符号链接
        TypeChar          = '3'    // 字符设备节点
        TypeBlock         = '4'    // 块设备节点
        TypeDir           = '5'    // 目录
        TypeFifo          = '6'    // fifo节点
        TypeCont          = '7'    // 保留
        TypeXHeader       = 'x'    // 扩展标题
        TypeXGlobalHeader = 'g'    // 全局扩展标题
        TypeGNULongName   = 'L'    // 下一个文件名称很长
        TypeGNULongLink   = 'K'    // 接下来将文件符号链接到一个带有长名字的文件
        TypeGNUSparse     = 'S'    // 稀疏文件(sparse file)
)

变量

var (
        ErrWriteTooLong    = errors.New("archive/tar: write too long")
        ErrFieldTooLong    = errors.New("archive/tar: header field too long")
        ErrWriteAfterClose = errors.New("archive/tar: write after close")
)
var (
        ErrHeader = errors.New("archive/tar: invalid tar header")
)

type Header(查看源代码)

标题代表 tar 档案中的单个标题。有些字段可能不会被填充。

type Header struct {
        Name       string    // 头文件条目的名称
        Mode       int64     // 许可和模式位
        Uid        int       // 所有者的用户ID
        Gid        int       // 所有者的组ID
        Size       int64     // 长度以字节为单位
        ModTime    time.Time // 修改时间
        Typeflag   byte      // 标题条目的类型
        Linkname   string    // 链接的目标名称
        Uname      string    // 所有者的用户名
        Gname      string    // 所有者的组名称
        Devmajor   int64     // 字符或块设备的主要数量
        Devminor   int64     // 少量的字符或块设备
        AccessTime time.Time // 访问时间
        ChangeTime time.Time // 状态更改时间
        Xattrs     map[string]string
}

func FileInfoHeader (查看源代码)

func FileInfoHeader(fi os.FileInfo, link string) (*Header, error)

FileInfoHeader 从 fi中 创建一个部分填充的 Header 。如果 fi 描述一个符号链接, FileInfoHeader 将链接记录为链接目标。如果 fi 描述一个目录,则会在该名称后附加一个斜杠。因为 os.FileInfo 的 Name 方法仅返回它描述的文件的基本名称,所以可能需要修改返回的头的 Name 字段以提供文件的完整路径名。

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

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

FileInfo 为 Header 返回一个 os.FileInfo。

type Reader(查看源代码)

Reader 提供对 tar 档案内容的顺序访问。tar 档案由一系列文件组成。Next 方法前进到存档中的下一个文件(包括第一个文件),然后可以将其视为一个 io.Reader 来访问该文件的数据。

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

func NewReader(查看源代码)

func NewReader(r io.Reader) *Reader

NewReader 从 r 中创建一个新的 Reader 阅读器。

func (*Reader) Next (查看源文档)

func (tr *Reader) Next() (*Header, error)

Next 阅读器前进到 tar 档案中的下一个条目。

在输入结束时返回 io.EOF 。

func (*Reader) Read(查看源代码)

func (tr *Reader) Read(b []byte) (int, error)

Read 阅读器读取 tar 档案中当前条目的读取内容。当它到达该条目的末尾时,它将返回0, io.EOF,直到Next 阅读器被调用到下一个条目。

无论 Header.Size 如何声明,在 TypeLink ,TypeSymLink,TypeChar, TypeBlock ,TypeDir 和 TypeFifo 等特殊类型上调用Read都会返回 0, io.EOF 。

type Writer(查看源代码)

Writer 提供 POSIX.1 格式的 tar 存档的顺序写入。tar 档案由一系列文件组成。调用 WriteHeader 然后开始一个新文件,然后调用 Write 来提供该文件的数据,最多共写入 hdr.Size 字节。

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

func NewWriter (查看源代码)

func NewWriter(w io.Writer) *Writer

NewWriter 创建一个写入 w 的新 Writer。

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

func (tw *Writer) Close() error

Close 关闭 tar 档案,将任何未写入的数据刷新到底层编写器(underlying writer)。

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

func (tw *Writer) Flush() error

刷新结束写入当前文件(可选)。

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

func (tw *Writer) Write(b []byte) (n int, err error)

Write 写入 tar 档案 中的当前条目。如果在 WriteHeader 之后写入超过 hdr.Size 的字节,Writer 将返回错误 ErrWriteTooLong 。

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

func (tw *Writer) WriteHeader(hdr *Header) error

WriteHeader 写入 hdr 并准备接受文件的内容。如果WriteHeader 不是第一个标题,则调用 Flush 。在 Close 之后调用将返回 ErrWriteAfterClose 。

档案 | 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 格式化字符串