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
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • Go语言压缩和解压缩tar.gz文件的方法

    本文实例讲述了Go语言压缩和解压缩tar.gz文件的方法.分享给大家供大家参考.具体分析如下: golang处理压缩包,最常用的就是tar.gz了,这里写了一个测试一下. 压缩文件: 复制代码 代码如下: package main import (     "fmt"     "os"     "io"     "archive/tar"     "compress/gzip" ) func main()

  • go语言通过zlib压缩数据的方法

    本文实例讲述了go语言通过zlib压缩数据的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "compress/zlib"     "bytes" ) func main() {     var input = []byte("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKsAAAAgCAYAA

  • GO语言实现批量压缩图片和水印

    前段时间想做个图片站,就用手机照了很多相片,但是要一个个用PS去压缩修改尺寸太麻烦了.最后想到了用golang去实现,算是边学边练吧.其中用到了github.com/nfnt/resize这个第三方库,仅仅支持JPG图片格式. 复制代码 代码如下: package main import (     "fmt"     "github.com/nfnt/resize"     "image"     "image/draw"

  • 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可

  • 易语言制作简单计时器小程序的方法

    简单计时器 易语言制作简单计时器用到以下几个功能: 编辑框 按钮 时钟 变量 如果命令 例程: 说明: 本方法是新手学习易语言制作的软件,深入学习易语言后你将会有更方便的写法 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想了解更多相关内容请查看下面相关链接

  • 易语言制作文件夹压缩备份工具的代码

    文件夹压缩备份工具 此功能需要加载精易模块5.6 .版本 2 .支持库 shell .支持库 iext .支持库 eCompress .程序集 窗口程序集1 .程序集变量 时间戳, 文本型 .程序集变量 过滤文本, 文本型, , "0" .子程序 _文件路径按钮_被单击 .局部变量 路径, 文本型 路径 = 浏览文件夹 ("选择一个文件夹备份", 假) .判断开始 (路径 = "") 提示框 ("请选择文件夹备份!") .默认

  • 易语言制作大王派我来巡山小程序

    大王派我来巡山 易语言制作大王派我来巡山小程序用到以下几个功能: 图片框 按钮 时钟 如果命令 例程: 说明: 本方法是新手学习易语言制作的软件,深入学习易语言后你将会知道更简单的写法 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想了解更多相关内容请查看下面相关链接

  • 利用R语言解压与压缩.tar.gz.zip等格式文件

    目录 .zip .tar.gz .gz 与 .bz2 1) 直接解压 2) 直接读取 参考 最近尝试用 R 对一些文件进行批量的解压与压缩,这里记录一些常用的解压与压缩的方法. 由于解压与压缩是对称的两种方法,这里我们着重以对文件的解压为例,分不同的格式进行讲解. .zip 压缩:zip() 解压:unzip() 若要压缩文件,就直接在 zip() 函数的第一个参数里面输入压缩后的文件名,第二个参数输入压缩前的文件名. 而解压文件就更简单了,直接利用 unzip() 里面加上需要解压的文件名称即

  • 利用Java实现zip压缩/解压缩

    由于网络带宽有限,所以数据文件的压缩有利于数据在Internet上的快速传输,同时也节 省服务器的外存空间. Java 1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩.网络传输和解 压缩的实现比较容易,下面介绍利用ZipEntry.ZipInputStream和ZipOutputStream三个Java 类实现zip数据压缩方式的编程方法. zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的 数据项存储压缩数据. 与zip文件有关

  • C++Zip压缩解压缩示例(支持递归压缩)

    第三方函数.头文件.测试工程下载地址:http://pan.baidu.com/s/1gSfKo 复制代码 代码如下: // 文件名: ZipFunction.h#pragma once#include "zip.h"#include "unzip.h" namespace ZipUtils{    // ---------------------------------------------------------------------------------

  • Java continue break制作简单聊天室程序

    Java continue break 制作简单聊天室程序,屏蔽不文明语言,显示每句话聊天时间 package com.swift; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class ChatWithBreakContinue { public static void main(String[] args) { Scanner scan = new Sc

  • 使用Python制作简单的小程序IP查看器功能

    前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固定的关系,所以我们需要借助网络上的数据库,或者说借助第三方的服务来查询.这里,我们选用IP.CN提供的IP地址查询服务. 基本环境配置 版本:Python3 系统:Windows 相关模块:PyQt5 实现效果图 完整代码 运行以上程序,点击按钮,大约卡顿半秒后,文本标签处就会显示我们电脑的IP地址

  • 易语言制作随机验证码教学

    如果能帮到你,请支持一下. 易语言制作注册登陆验证码. 随机生成数字字母,大小写字母,易语言验证码! 1.先打开易语言,新建一个窗口. 根据所需绘制基本组件. 我这里绘制的是一个登陆窗口. 2.添加一个分组框,在分组框内添加4个标签,各标签标题大小间距根据需求设置.(注:分组框的目的就是方便同时调整4个标签,在把标签加入到分组框时应该注意,先选中分组框,然后点击组件里面的标签在分组框内绘制.) 3.好了,现在开始写代码了. 打开窗口程序集,Ctrl + L 添加一个程序集变量,验证.文本型 目的

随机推荐