go语言制作的zip压缩程序
作者:hebedich 发布时间:2024-02-12 21:03:00
标签:go语言,zip压缩
可以压缩文件和目录。
package main
import (
"archive/zip"
"bytes"
"fmt"
"io/ioutil"
"os"
"path/filepath"
)
func main() {
if err := compress(`gopkg`, `gopkg.zip`); err != nil {
fmt.Println(err)
}
}
// 参数frm可以是文件或目录,不会给dst添加.zip扩展名
func compress(frm, dst string) error {
buf := bytes.NewBuffer(make([]byte, 0, 10*1024*1024)) // 创建一个读写缓冲
myzip := zip.NewWriter(buf) // 用压缩器包装该缓冲
// 用Walk方法来将所有目录下的文件写入zip
err := filepath.Walk(frm, func(path string, info os.FileInfo, err error) error {
var file []byte
if err != nil {
return filepath.SkipDir
}
header, err := zip.FileInfoHeader(info) // 转换为zip格式的文件信息
if err != nil {
return filepath.SkipDir
}
header.Name, _ = filepath.Rel(filepath.Dir(frm), path)
if !info.IsDir() {
// 确定采用的压缩算法(这个是内建注册的deflate)
header.Method = 8
file, err = ioutil.ReadFile(path) // 获取文件内容
if err != nil {
return filepath.SkipDir
}
} else {
file = nil
}
// 上面的部分如果出错都返回filepath.SkipDir
// 下面的部分如果出错都直接返回该错误
// 目的是尽可能的压缩目录下的文件,同时保证zip文件格式正确
w, err := myzip.CreateHeader(header) // 创建一条记录并写入文件信息
if err != nil {
return err
}
_, err = w.Write(file) // 非目录文件会写入数据,目录不会写入数据
if err != nil { // 因为目录的内容可能会修改
return err // 最关键的是我不知道咋获得目录文件的内容
}
return nil
})
if err != nil {
return err
}
myzip.Close() // 关闭压缩器,让压缩器缓冲中的数据写入buf
file, err := os.Create(dst) // 建立zip文件
if err != nil {
return err
}
defer file.Close()
_, err = buf.WriteTo(file) // 将buf中的数据写入文件
if err != nil {
return err
}
return nil
}
以上所述就是本文的全部内容了,希望大家能够喜欢。


猜你喜欢
- 索引类型聚簇索引: 叶子节点存储的是行记录,每个表必须要有至少一个聚簇索引。使用聚簇索引查询会很快,因为可以直接定位到行记录普通索引:二级索
- 本文实例讲述了Python使用scipy模块实现一维卷积运算。分享给大家供大家参考,具体如下:一 介绍signal模块包含大量滤波函数、 *
- 首先,未来Python完全取代Java的可能性并不大,但是Python的发展确实能够挤占一部分Java的应用空间。Python语言在最近几年
- 首先获取ip:<% userip=Request.ServerVariables(&qu
- 目录mapfiltersomeeveryfindIndexpipe参考答案一、返回函数接受一个参数二、返回函数接受不定参数实现 lodash
- 如下所示:<div id="app"><el-form :model="ruleForm2&
- 面试题1:先说一下什么是MySQL事务吧正经回答:简单说,事务就是一组原子性的SQL执行单元。如果数据库引擎能够成功地对数据库应 用该组査询
- 1.直接输入sql执行MySQL> select now();+---------------------+| now() |+---
- 介绍:SQL Server 2008变更数据捕获SQL Server 2008的CDC函数读取激活了CDC的每个表所关联的事务日志来记录系统
- 前言神奇的JQuery怎么设置checkbox状态时好时坏?明明同一行代码,断点跟踪确实执行了,但是有时候好使,有时候却没有生效。毕竟对JS
- 已经下载了wampserver,以后有时间试下在本地运行ThinkPHP。在app/lib/Action/文件夹下可以为每一个模块定义控制器
- Python实现Mysql数据统计的实例代码如下所示:import pymysqlimport xlwtexcel=xlwt.Workboo
- MySQL里Create Index 能否创建主键 Primary Key? 答案: 不能,必须用 Alter table 创建。 MySQ
- 上图代码# -*- coding: utf-8 -*-"""Created on Sun Jun 18 20:
- CSS网页布局开发中,会有很多小技巧,这里再扩展一下您所想要得到的知识,相信您会有很多收获!一、ul标签在Mozilla中默认是有paddi
- 概述要访问一个变量的内容,可以直接使用其名称。如果该变量是一个数组,可以使用变量名称和关键字或索引的组合来访问其内容。像其他变量一样,使用运
- 官方文档:https://elasticsearch-py.readthedocs.io/en/master/1、介绍python提供了操作
- 前言在前边的几篇文章中已经基本分享完了编译器前端的一些工作,后边的几篇主要是关于编译器对抽象语法树进行分析和重构,然后完成一系列的优化,其中
- 方法1:pythonw xxx.py方法2:将.py改成.pyw (这个其实就是使用脚本解析程序pythonw.exe)跟 python.e
- 例如,有一个字典如下:>>> dic = {"name": "botoo",&qu