- 初始化信息,打包文件名,文件路径
-
//打包的文件名 fileTarget := "./picture.tar" // 需要打包的文件路径 filesource := "D:/picture/" // 创建打包文件 tarfile, err := os.Create(fileTarget) if err != nil { if err == os.ErrExist { if err := os.Remove(fileTarget); err != nil { fmt.Println(err) } } else { fmt.Println(err) } } // 关闭文件 defer tarfile.Close() // 写入文件句柄 trawriter := tar.NewWriter(tarfile) // 获取文件信息 sfileInfo, err := os.Stat(filesource) if err != nil { fmt.Println(err) } // 判断是否是文件或者文件夹 if !sfileInfo.IsDir() { tarFile(filesource, sfileInfo, trawriter) } else { tarFolder(filesource, trawriter) }
2.判断文件信息,进行打包文件
// 打包文件
func tarFile(filesource string, info os.FileInfo, tarwriter *tar.Writer) error {
// 打开文件
afile, err := os.Open(filesource)
if err != nil {
fmt.Println(err)
return err
}
// 关闭文件句柄
defer afile.Close()
// 头文件信息
header, err := tar.FileInfoHeader(info, "")
if err != nil {
fmt.Println(err)
return err
}
header.Name = filesource
// 写入文件
err = tarwriter.WriteHeader(header)
if err != nil {
fmt.Println(err)
return err
}
if _, err = io.Copy(tarwriter, afile); err != nil {
fmt.Println(err)
return err
}
return nil
}
// 打包文件夹
func tarFolder(filesource string, trawriter *tar.Writer) error {
return filepath.Walk(filesource, func(targetpath string, info fs.FileInfo, err error) error {
if info == nil {
return err
}
if info.IsDir() {
if filesource == targetpath {
return nil
}
header, err := tar.FileInfoHeader(info, "")
if err != nil {
return err
}
header.Name = filepath.Join(filesource, strings.TrimPrefix(targetpath, filesource))
if err = trawriter.WriteHeader(header); err != nil {
return err
}
os.Mkdir(strings.TrimPrefix(filesource, info.Name()), os.ModeDir)
return tarFolder(targetpath, trawriter)
}
return tarFile(targetpath, info, trawriter)
})
}
3.打包完成可在跟目录看到打包文件