archive

tar

打包

 1 package main
 2 
 3 import (
 4     "archive/tar"
 5     "io"
 6     "log"
 7     "os"
 8 )
 9 
10 func main() {
11     dst := "C:/Users/xxc/Desktop/task/github/exercise/go/archive/examples/e.tar"
12     if err := tAr([]string{"C:/Users/xxc/Desktop/task/github/exercise/go/archive/examples/e.go",
13         "C:/Users/xxc/Desktop/task/github/exercise/go/archive/tar.go"}, dst); err != nil {
14         log.Fatal(err)
15     }
16 
17 }
18 
19 func tAr(src []string, dst string) error {
20     // 创建tar文件
21     fw, err := os.Create(dst)
22     if err != nil {
23         return err
24     }
25     defer fw.Close()
26     // 通过fw创建tar.Writer
27     tw := tar.NewWriter(fw)
28     // 如果关闭失败会造成tar包不完整
29     defer func() {
30         if err := tw.Close(); err != nil {
31             log.Println(err)
32         }
33     }()
34 
35     for _, filename := range src {
36         fi, err := os.Stat(filename)
37         if err != nil {
38             log.Println(err)
39             continue
40         }
41         hdr, err := tar.FileInfoHeader(fi, "")
42         // 将tar文件信息hdr写入到tw
43         err = tw.WriteHeader(hdr)
44         if err != nil {
45             return err
46         }
47 
48         // 将文件数据写入
49         fs, err := os.Open(filename)
50         if err != nil {
51             return err
52         }
53         if _, err = io.Copy(tw, fs); err != nil {
54             return err
55         }
56         fs.Close()
57     }
58     return nil
59 }

解包

 1 package main
 2 
 3 import (
 4     "archive/tar"
 5     "io"
 6     "log"
 7     "os"
 8 )
 9 
10 func main() {
11     srcFile := "e1.tar"
12     // 打开tar包
13     fr, err := os.Open(srcFile)
14     if err != nil {
15         log.Fatal(err)
16     }
17     defer fr.Close()
18 
19     tr := tar.NewReader(fr)
20     for hdr, err := tr.Next(); err != io.EOF; hdr, err = tr.Next() {
21         if err != nil {
22             log.Println(err)
23             continue
24         }
25         // 读取文件信息
26         fi := hdr.FileInfo()
27         // 创建一个空文件, 用来写入解包后的数据
28         fw, err := os.Create(fi.Name())
29         if err != nil {
30             log.Println(err)
31             continue
32         }
33 
34         if _, err := io.Copy(fw, tr); err != nil {
35             log.Println(err)
36         }
37         os.Chmod(fi.Name(), fi.Mode().Perm())
38         fw.Close()
39     }
40 }

zip

压缩

 1 package main
 2 
 3 import (
 4     "os"
 5     "log"
 6     "archive/zip"
 7     "io"
 8     "fmt"
 9 )
10 
11 func main() {
12     err := Zip("demo.zip", []string{})
13     if err != nil {
14         fmt.Println(err)
15     }
16 }
17 
18 func Zip(zipFile string, fileList []string) error {
19     // 创建 zip 包文件
20     fw, err := os.Create(zipFile)
21     if err != nil {
22         log.Fatal()
23     }
24     defer fw.Close()
25 
26     // 实例化新的 zip.Writer
27     zw := zip.NewWriter(fw)
28     defer func() {
29         // 检测一下是否成功关闭
30         if err := zw.Close(); err != nil {
31             log.Fatalln(err)
32         }
33     }()
34 
35     for _, fileName := range fileList {
36         fr, err := os.Open(fileName)
37         if err != nil {
38             return err
39         }
40         fi, err := fr.Stat()
41         if err != nil {
42             return err
43         }
44         // 写入文件的头信息
45         fh, err := zip.FileInfoHeader(fi)
46         w, err := zw.CreateHeader(fh)
47         if err != nil {
48             return err
49         }
50         // 写入文件内容
51         _, err = io.Copy(w, fr)
52         if err != nil {
53             return err
54         }
55     }
56     return nil
57 }

解压

 1 package main
 2 
 3 import (
 4     "archive/zip"
 5     "os"
 6     "io"
 7     "fmt"
 8 )
 9 
10 func main() {
11     err := Unzip("demo.zip")
12     if err != nil {
13         fmt.Println(err)
14     }
15 }
16 
17 func Unzip(zipFile string) error {
18     zr, err := zip.OpenReader(zipFile)
19     defer zr.Close()
20     if err != nil {
21         return err
22     }
23 
24     for _, file := range zr.File {
25         // 如果是目录,则创建目录
26         if file.FileInfo().IsDir() {
27             if err = os.MkdirAll(file.Name, file.Mode());err != nil {
28                 return err
29             }
30             continue
31         }
32         // 获取到 Reader
33         fr, err := file.Open()
34         if err != nil {
35             return err
36         }
37 
38         fw, err := os.OpenFile(file.Name, os.O_CREATE|os.O_RDWR|os.O_TRUNC, file.Mode())
39         if err != nil {
40             return err
41         }
42         _, err = io.Copy(fw, fr)
43         if err != nil {
44             return err
45         }
46         fw.Close()
47         fr.Close()
48     }
49     return nil
50 }

猜你喜欢

转载自www.cnblogs.com/chenguifeng/p/12013831.html