go语言制作的zip压缩程序

秋葵 分享 时间: 收藏本文

【简介】感谢网友“秋葵”参与投稿,以下是小编精心整理的go语言制作的zip压缩程序(共5篇),供大家参考借鉴,希望可以帮助到有需要的朋友。

篇1:go语言制作的zip压缩程序

这篇文章主要介绍了go语言制作的zip压缩程序,其主体思路是首先创建一个读写缓冲,然后用压缩器包装该缓冲,用Walk方法来将所有目录下的文件写入zip,有需要的小伙伴参考下,

可以压缩文件和目录。

package mainimport ( “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 = 8file, 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}

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

篇2:go语言制作端口扫描器

本文给大家分享的是使用go语言编写的TCP端口扫描器,可以选择IP范围,扫描的端口,以及多线程,有需要的小伙伴可以参考下,

GO语言编写的TCP端口扫描器,本人的第一个GO程序。

Git@OSC:git.oschina.net/youshusoft/GoScanner

使用命令:

Scanner startIp [endIp] port thread

参数说明:

startIp 开始IP

endIp 结束IP,可选,不输入表示只扫描startIp

port 扫描端口,单个端口:3389;多个端口:1433,3389;连续端口:135-3389

thread 最大并发线程数,最高2048

扫描结果保存在同目录下的 result.txt 中,每次启动都会清掉之前的内容。

例子一:

Scanner 58.96.172.22 58.96.172.220 80 512

扫描58.96.172.22到58.96.172.220中的80端口,最大并发线程512。

例子二:

Scanner 58.96.172.22 58.96.172.220 21,5631 512

扫描58.96.172.22到58.96.172.220中的21和5631端口,最大并发线程512。

例子三:

Scanner 58.96.172.22 58.96.172.220 1-520 512

扫描58.96.172.22到58.96.172.220中的1到520端口,最大并发线程512。

例子四:

Scanner 58.96.172.22 1-520 512

扫描58.96.172.22中的1到520端口,最大并发线程512。

package mainimport (“fmt”“strconv”“flag”“strings”“net”“os”)/** 扫描地址*/var ipAddrs chan string = make(chan string)//扫描结果var result chan string = make(chan string)//线程数var thread chan int = make(chan int)var nowThread int;//关闭程序var clo chan bool = make(chan bool)//保存结果func writeResult(){ fileName := “result.txt” fout,err := os.Create(fileName) if err != nil{ //文件创建失败 fmt.Println(fileName + “ create error”) } defer fout.Close() s,ok := <- result for ;ok;{ fout.WriteString(s + “\\r\\n”) s,ok = <- result } //通知进程退出 clo <- true; }//根据线程参数启动扫描线程func runScan(){ t,ok := <- thread nowThread = t; if ok{ for i := 0;i < nowThread;i++{ go scan(strconv.Itoa(i)) } } //等待线程终止 for;<-thread == 0;{ nowThread-- if nowThread == 0{//全部线程已终止,关闭结果写入,退出程序close(result)break } }}/** 扫描线程*/func scan(threadId string){ s,ok := <-ipAddrs for;ok;{ fmt.Println(“[thread-” + threadId + “] scan:” + s) _,err := net.Dial(“tcp”,s) if err == nil{//端口开放result <- s } s,ok = <-ipAddrs } fmt.Println(“[thread-” + threadId + “] end”) thread <- 0;}//获取下一个IPfunc nextIp(ip string) string{ ips := strings.Split(ip,“.”) var i int; for i = len(ips) - 1;i >= 0;i--{ n,_ := strconv.Atoi(ips[i]) if n >= 255{//进位ips[i] = “1”}else{//+1n++ips[i] = strconv.Itoa(n)break } } if i == -1{ //全部IP段都进行了进位,说明此IP本身已超出范围 return “”; } ip = “” leng := len(ips) for i := 0;i < leng;i++{ if i == leng -1{ip += ips[i] }else{ip += ips[i] + “.” } } return ip}//生成IP地址列表func processIp(startIp,endIp string) []string{ var ips = make([]string,0) for ;startIp != endIp;startIp = nextIp(startIp){ if startIp != “”{ips = append(ips,startIp) } } ips = append(ips,startIp) return ips}//处理参数func processFlag(arg []string){ //开始IP,结束IP var startIp,endIp string //端口 var ports []int = make([]int,0) index := 0 startIp = arg[index] si := net.ParseIP(startIp) if si == nil{ //开始IP不合法 fmt.Println(“‘startIp‘ Setting error”) return } index++ endIp = arg[index] ei := net.ParseIP(endIp) if(ei == nil){ //未指定结束IP,即只扫描一个IP endIp = startIp }else{ index++ } tmpPort := arg[index] if strings.Index(tmpPort,“-”) != -1{ //连续端口 tmpPorts := strings.Split(tmpPort,“-”) var startPort,endPort int var err error startPort,err = strconv.Atoi(tmpPorts[0]) if err != nil || startPort < 1 || startPort >65535{//开始端口不合法return } if len(tmpPorts) >= 2{//指定结束端口endPort,err = strconv.Atoi(tmpPorts[1])if err != nil || endPort < 1 || endPort >65535 || endPort < startPort{ //结束端口不合法 fmt.Println(“‘endPort‘ Setting error”) return} }else{//未指定结束端口endPort = 65535 } for i := 0;startPort + i <= endPort;i++{ports = append(ports,startPort + i) } }else{ //一个或多个端口 ps := strings.Split(tmpPort,“,”) for i := 0;i < len(ps);i++{p,err := strconv.Atoi(ps[i])if err != nil{ //端口不合法 fmt.Println(“‘port‘ Setting error”) return}ports = append(ports,p) } } index++ t,err := strconv.Atoi(arg[index]) if(err != nil){ //线程不合法 fmt.Println(“‘thread‘ Setting error”) return } //最大线程2048 if t < 1{ t = 1; }else if t >2048{ t = 2048; } //传送启动线程数 thread <- t //生成扫描地址列表 ips := processIp(startIp,endIp) il := len(ips) for i := 0; i < il;i++{ pl := len(ports) for j := 0;j < pl;j++{ipAddrs <- ips[i] + “:” + strconv.Itoa(ports[j]) } } close(ipAddrs)}func main(){ flag.Parse() if flag.NArg() != 3 && flag.NArg() != 4{ //参数不合法 fmt.Println(“Parameter error”) return } //获取参数 args := make([]string,0,4) for i := 0;i < flag.NArg();i++{ args = append(args,flag.Arg(i)) } //启动扫描线程 go runScan() //启动结果写入线程 go writeResult() //参数处理 processFlag(args) //等待退出指令 <- clo; fmt.Println(“Exit”)}

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

篇3:go语言制作一个gif动态图

这篇文章主要介绍了go制作一个gif动态图的相关资料,需要的朋友可以参考下

如题,关键不是图怎么样,而是说,go可以拿来实现动态图验证码,加上go支持cgi、fcgi,完全可以做个exe拿去增补现有的服务器么,

ball.go

package mainimport ( “github.com/hydra13142/cube” “github.com/hydra13142/geom” “github.com/hydra13142/paint” “image” “image/color/palette” “image/gif” “math” “os”)var ( pln *cube.Plain unx cube.Vector uny cube.Vector)const ( H = 18 W = 36)func init { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{4, 4, 3}) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit() unx = cube.OuterProduct(uny, cube.Vector{4, 4, 3}).Unit()}func main() { var x [H + 1][W]cube.Point var y [H + 1][W]geom.Point dz := math.Pi / H dxy := math.Pi * 2 / W for i := 0; i <= H; i++ { az := float64(i)*dz - math.Pi/2 r := 140 * math.Cos(az) z := 140 * math.Sin(az) for j := 0; j < W; j++ {axy := float64(j) * dxyx[i][j] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z} } } pics := make([]*image.Paletted, 0, 20) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := dxy / 20 delay := make([]int, 0, 20) for t := 0; t < 20; t++ { img.Image = image.NewPaletted(image.Rect(0, 0, 300, 300), palette.Plan9) for i := 0; i <= H; i++ {for j := 0; j < W; j++ { ox := cube.FromTo(cube.Point{}, x[i][j]) y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)} a, b := x[i][j].X, x[i][j].Y x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp) x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp)} } for i := 0; i < H; i++ {for j := 0; j < W; j++ { img.Line( 150+int(y[i][j].X), 150-int(y[i][j].Y), 150+int(y[i][(j+1)%W].X), 150-int(y[i][(j+1)%W].Y), ) img.Line( 150+int(y[i][j].X), 150-int(y[i][j].Y), 150+int(y[i+1][j].X), 150-int(y[i+1][j].Y), )} } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 5) } file, _ := os.Create(“ball.gif”) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), })}

woniu.go

package mainimport ( “github.com/hydra13142/cube” “github.com/hydra13142/geom” “github.com/hydra13142/paint” “image” “image/color/palette” “image/gif” “math” “os”)var ( pln *cube.Plain unx, uny cube.Vector)const ( H = 18 W = 96)func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{2, 2, 1}) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit() unx = cube.OuterProduct(uny, cube.Vector{2, 2, 1}).Unit()}func main() { var x [H + 1][W]cube.Point var y [H + 1][W]geom.Point dz := math.Pi / H dxy := math.Pi * 4 / W for i := 0; i <= H; i++ { az := float64(i)*dz - math.Pi/2 r := 300 * math.Cos(az) z := 100 * math.Sin(az) for j := 0; j < W; j++ {axy := float64(j) * dxyR := float64(j) * r / Wx[i][j] = cube.Point{math.Cos(axy) * R, math.Sin(axy) * R, z} } } pics := make([]*image.Paletted, 0, 20) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := math.Pi / W delay := make([]int, 0, 2*W) for t := 0; t < 2*W; t++ { img.Image = image.NewPaletted(image.Rect(0, 0, 600, 300), palette.Plan9) for i := 0; i <= H; i++ {for j := 0; j < W; j++ { ox := cube.FromTo(cube.Point{}, x[i][j]) y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)} a, b := x[i][j].X, x[i][j].Y x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp) x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp)} } img.Line(300+int(y[0][0].X),150-int(y[0][0].Y),300+int(y[H][0].X),150-int(y[H][0].Y), ) for i := 0; i < H; i++ {for j := 1; j < W; j++ { img.Line( 300+int(y[i][j].X), 150-int(y[i][j].Y), 300+int(y[i][j-1].X), 150-int(y[i][j-1].Y), ) img.Line( 300+int(y[i][j].X), 150-int(y[i][j].Y), 300+int(y[i+1][j].X), 150-int(y[i+1][j].Y), )} } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 5) } file, _ := os.Create(“woniu.gif”) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), })}

rotate.go

package mainimport ( “github.com/hydra13142/cube” “github.com/hydra13142/geom” “github.com/hydra13142/paint” “image” “image/color/palette” “image/gif” “math” “os”)var ( pln *cube.Plain unx, uny cube.Vector)const ( H = 9 W = 36)func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{4, 4, 3}) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit() unx = cube.OuterProduct(uny, cube.Vector{4, 4, 3}).Unit()}func main() { var x [H*W + 1]cube.Point var y [H*W + 1]geom.Point dxy := (math.Pi * 2) / W dz := math.Pi / H for i := 0; i <= H*W; i++ { az := float64(i)*dz/W - math.Pi/2 r := 140 * math.Cos(az) z := 140 * math.Sin(az) axy := float64(i) * dxy x[i] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z} } pics := make([]*image.Paletted, 0, 20) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := math.Pi * 2 / (W * 3) delay := make([]int, 0, 3*W) for t := 0; t < 3*W; t++ { img.Image = image.NewPaletted(image.Rect(0, 0, 300, 300), palette.Plan9) for i := 0; i <= H*W; i++ {ox := cube.FromTo(cube.Point{}, x[i])y[i] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)}a, b := x[i].X, x[i].Zx[i].X = a*math.Cos(stp) - b*math.Sin(stp)x[i].Z = b*math.Cos(stp) + a*math.Sin(stp) } img.Line(150+int(y[0].X),150-int(y[0].Y),150+int(y[H*W].X),150-int(y[H*W].Y), ) for i := 0; i < H*W; i++ {img.Line( 150+int(y[i].X), 150-int(y[i].Y), 150+int(y[i+1].X), 150-int(y[i+1].Y),) } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 8) } file, _ := os.Create(“rotate.gif”) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), })}

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

篇4:go语言通过zlib压缩数据的方法

作者:紫青城 字体:[增加 减小] 类型:

这篇文章主要介绍了go语言通过zlib压缩数据的方法,实例分析了Go语言中zlib的使用技巧,需要的朋友可以参考下

本文实例讲述了go语言通过zlib压缩数据的方法,分享给大家供大家参考。具体实现方法如下:

代码如下:

package main

import (

“fmt”

“compress/zlib”

“bytes”

)

func main() {

var input = []byte(“data:image/png;base64,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”)

var buf bytes.Buffer

compressor, err := zlib.NewWriterLevelDict(&buf, zlib.BestCompression, input)

if err != nil {

fmt.Println(“压缩失败”)

return

}

compressor.Write(input)

compressor.Close()

fmt.Println(buf.Bytes())

fmt.Println(len(buf.Bytes()))

fmt.Println(len(input))

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇5:Go语言压缩和解压缩tar.gz文件的方法

作者:不吃皮蛋 字体:[增加 减小] 类型:转载

golang处理压缩包,最常用的就是tar.gz了,这里写了一个测试一下。

压缩文件:

代码如下:

package main

import (

“fmt”

“os”

“io”

“archive/tar”

“compress/gzip”

)

func main() {

// file write

fw, err := os.Create(“tar/lin_golang_src.tar.gz”)

if err != nil {

panic(err)

}

defer fw.Close()

// gzip write

gw := gzip.NewWriter(fw)

defer gw.Close()

// tar write

tw := tar.NewWriter(gw)

defer tw.Close()

// 打开文件夹

dir, err := os.Open(“file/”)

if err != nil {

panic(nil)

}

defer dir.Close()

// 读取文件列表

fis, err := dir.Readdir(0)

if err != nil {

panic(err)

}

// 遍历文件列表

for _, fi := range fis {

// 逃过文件夹, 我这里就不递归了

if fi.IsDir() {

continue

}

// 打印文件名称

fmt.Println(fi.Name())

// 打开文件

fr, err := os.Open(dir.Name() + “/” + fi.Name())

if err != nil {

panic(err)

}

defer fr.Close()

// 信息头

h := new(tar.Header)

h.Name = fi.Name()

h.Size = fi.Size()

h.Mode = int64(fi.Mode())

h.ModTime = fi.ModTime()

// 写信息头

err = tw.WriteHeader(h)

if err != nil {

panic(err)

}

// 写文件

_, err = io.Copy(tw, fr)

if err != nil {

panic(err)

}

}

fmt.Println(“tar.gz ok”)

}

解压文件:

代码如下:

package main

import (

“fmt”

“os”

“io”

// “time”

“archive/tar”

“compress/gzip”

)

func main() {

// file read

fr, err := os.Open(“tar/lin_golang_src.tar.gz”)

if err != nil {

panic(err)

}

defer fr.Close()

// gzip read

gr, err := gzip.NewReader(fr)

if err != nil {

panic(err)

}

defer gr.Close()

// tar read

tr := tar.NewReader(gr)

// 读取文件

for {

h, err := tr.Next()

if err == io.EOF {

break

}

if err != nil {

panic(err)

}

// 显示文件

fmt.Println(h.Name)

// 打开文件

fw, err := os.OpenFile(“file2/” + h.Name, os.O_CREATE | os.O_WRONLY, 0644/*os.FileMode(h.Mode)*/)

if err != nil {

panic(err)

}

defer fw.Close()

// 写文件

_, err = io.Copy(fw, tr)

if err != nil {

panic(err)

}

}

fmt.Println(“un tar.gz ok”)

}

这样以后打包下载东西的时候就可以使用了,

希望本文所述对大家的Go语言程序设计有所帮助。

相关专题 语言程序