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 }
原文:https://www.cnblogs.com/chenguifeng/p/12013831.html