分享
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
一、对文件进行压缩
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()
}
}
这些代码已经测试过可以正常使用,参考了很多人的代码得来,用作记录,希望帮助自己和需要的人,也非常感谢前辈们提供的代码
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信5565 次点击
上一篇:10天入门go语言教程- 循环
下一篇:Go之Http包的服务端介绍
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
一、对文件进行压缩
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()
}
}
这些代码已经测试过可以正常使用,参考了很多人的代码得来,用作记录,希望帮助自己和需要的人,也非常感谢前辈们提供的代码