golang 进行文件夹的压缩与解压


本文摘自网络,作者runningstarh,侵删。


一、对文件进行压缩 

package main

import (
"archive/zip"
"io"
"os"
"path/filepath"
"strings"
)

func main() {
	Zip(`D:\awesomeProject1\port\golearn`, `store.gz`)
}

// 打包成zip文件
func Zip(src_dir string, zip_file_name string) {

	// 预防:旧文件无法覆盖
	os.RemoveAll(zip_file_name)

	// 创建:zip文件
	zipfile, _ := os.Create(zip_file_name)
	defer zipfile.Close()

	// 打开:zip文件
	archive := zip.NewWriter(zipfile)
	defer archive.Close()

	// 遍历路径信息
	filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {

		// 如果是源路径,提前进行下一个遍历
		if path == src_dir {
			return nil
		}

		// 获取:文件头信息
		header, _ := zip.FileInfoHeader(info)
		header.Name = strings.TrimPrefix(path, src_dir+`/`)

		// 判断:文件是不是文件夹
		if info.IsDir() {
			header.Name += `/`
		} else {
			// 设置:zip的文件压缩算法
			header.Method = zip.Deflate
		}

		// 创建:压缩包头部信息
		writer, _ := archive.CreateHeader(header)
		if !info.IsDir() {
			file, _ := os.Open(path)
			defer file.Close()
			io.Copy(writer, file)
		}
		return nil
	})
}

二、解压

package main

import (
	"archive/zip"
	"fmt"
	"io"
	"os"
)

func main() {
	// file read
	//打开并读取压缩文件中的内容
	fr, err := zip.OpenReader("D:\\awesomeProject1\\port\\store.gz")
	if err != nil {
		panic(err)
	}
	defer fr.Close()
	//r.reader.file 是一个集合,里面包括了压缩包里面的所有文件
	for _, file := range fr.Reader.File {
		//判断文件该目录文件是否为文件夹
		if file.FileInfo().IsDir() {
			err := os.MkdirAll(file.Name, 0644)
			if err != nil {
				fmt.Println(err)
			}
			continue
		}
		//为文件时,打开文件
		r, err := file.Open()

		//文件为空的时候,打印错误
		if err != nil {
			fmt.Println(err)
			continue
		}
		//这里在控制台输出文件的文件名及路径
		fmt.Println("unzip: ", file.Name)

		//在对应的目录中创建相同的文件
		NewFile, err := os.Create(file.Name)
		if err != nil {
			fmt.Println(err)
			continue
		}
		//将内容复制
		io.Copy(NewFile, r)
		//关闭文件
		NewFile.Close()
		r.Close()
	}
}

这些代码已经测试过可以正常使用,参考了很多人的代码得来,用作记录,希望帮助自己和需要的人,也非常感谢前辈们提供的代码




相关阅读 >>

结合kubebuilder与code-generator开发operator

Golang 泛型

Golang有指针吗

聊聊dubbo-Go-proxy的parammapper

Goland如何正确开启一个项目

macbook linux 树莓派raspberrypi安装Golang环境

数据结构6:栈、队列、堆

Go语言 Goto 语句

【译文】Go 高级并发

手撸Golang 基本数据结构与算法 选择排序

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...