1. 程式人生 > >Go-歸檔文件-tar

Go-歸檔文件-tar

true 當前 ack clas ros span wro 實體 sof

文件歸檔 tar
  1. 創建一個tar頭部並自動填充tar頭部信息 tar.FileInfoHeader() 聯合 os.Stat() 方法
  2. 手動填寫 tar頭部信息 tar.Header{}

讀取歸檔文件
  1. 打開文件 os.Open()
  2. 創建讀取對象 tar.NewReader()
  4. 獲取讀取對象文件信息 .FileInfo()
  5. 獲取下一個實體 .Next()
  6. 讀取當前實體內容 .Read()

歸檔文件寫入內容
  1. 打開tar 文件 os.OpenFile()
  2. 創建 tar寫對象 tar.NewWriter()


  3. 獲取文件信息 os.Star()
  4. 自動填充文件信息 tar.FielInfoHeader()
  5. 寫入文件頭 .WriterHeader()
  6. 讀取源文件所有內容內容 ioutil.ReadAll()
  7. 寫入文件內容 .Write

package main

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

func main() {
	// 目標路徑
	targetPath  := "C:\\workspace"
	//歸檔文件名
	appleFrameName := "appleFrame.tar"
	// 文件歸檔
	err := TarFile(targetPath, appleFrameName)
	if err != nil {
		log.Fatalln(err)
		return
	}
	err = TarRead(targetPath, appleFrameName)
	if err != nil {
		log.Fatalln(err)
		return
	}
}

// 歸檔目標下文件
func TarFile(targetPath, appleFrameName string) (err error) {
	// 獲取目標目錄下所有文件
	files := make([]string, 0)
	dirs, err := ioutil.ReadDir(targetPath)
	if err != nil {
		return
	}
	fmt.Println(dirs)
	for _, file := range dirs {
		if file.IsDir() {
			continue
		}
		files = append(files, file.Name())
	}

	fmt.Println(files)
	// 創建蘋果框
	appleFrame, err := os.OpenFile("C:\\workspace\\" + appleFrameName,os.O_CREATE|os.O_WRONLY, 644)
	if err != nil {
		log.Fatalln(err)
		return
	}
	defer appleFrame.Close()
	appleTar := tar.NewWriter(appleFrame)
	defer appleTar.Close()

	// 放入蘋果, 同名則直接覆蓋掉
	for _, file := range files {
		// 獲取文件信息
		fileInfo, err := os.Stat(targetPath + "\\" + file)
		if err != nil {
			log.Fatalln(err)
			return err
		}
		// 自動填充頭部信息
		hdr, err := tar.FileInfoHeader(fileInfo, "")
		if err != nil {
			log.Fatalln(err)
			return err
		}
		// 寫入頭部信息
		err = appleTar.WriteHeader(hdr)
		if err != nil {
			log.Fatalln(err)
			return err
		}
		f, err := os.Open(targetPath + "\\" + file)
		if err != nil {
			fmt.Println(err)
			return err
		}
		// 讀取文件所有內容
		content, err := ioutil.ReadAll(f)
		if err != nil {
			log.Fatalln(err)
			return err
		}
		// 寫入到蘋果框中
		appleTar.Write(content)
		// 關閉文件
		f.Close()
	}
	return
}

//讀取歸檔文件
func TarRead(targetPath, appleFrameName string) (err error) {
	f, err := os.Open(targetPath + "\\" + appleFrameName)
	if err != nil {
		return
	}
	defer f.Close()
	tr := tar.NewReader(f)
	for hdr, err := tr.Next(); err != io.EOF; hdr, err = tr.Next(){
		if err != nil {
			return err
		}
		fmt.Println(hdr.Name)
	}
	return
}

  

Go-歸檔文件-tar