golang實現文件壓縮解壓縮


遇到一個情況,就是get請求了一個url,返回的直接是一個壓縮包,如果瀏覽器直接訪問那個url,那么就是把壓縮文件下載下載下來了。

所以想用golang實現以下,將get請求獲取的壓縮包文件,解壓縮,然后讀取內容。寫了個demo

package main

import (
    "archive/zip"
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
    "path/filepath"
)

func main() {
    var durl = "https://test.com.cn/data/spot/daily/test.zip"
    resp,err := http.Get(durl)
    if err != nil{
        return
    }
    defer resp.Body.Close()
    byt,_ := ioutil.ReadAll(resp.Body)
    num := int64(len(byt))
    zipReader,_ := zip.NewReader(bytes.NewReader(byt),num)
    //var codeList []string
    for _,_file := range zipReader.File{
        fmt.Println(_file.Name)
        f,_ := _file.Open()
        desfile,err1 := os.OpenFile(_file.Name,os.O_CREATE|os.O_WRONLY,os.ModePerm)
        if err1 == nil{
            io.CopyN(desfile,f,int64(_file.UncompressedSize64))
            desfile.Close()
        }else{
            defer desfile.Close()
        }

        //createZip(_file.Name)
    }

    //err := Zip("ETHUSDT-4h-2021-09-14.csv","test2.zip")
    //if err != nil{
    //    fmt.Println(err)
    //}
}


//壓縮文件
func Zip(srcFile string, destZip string) error {
    zipFile,err := os.Create(destZip)
    if err !=nil {
        return err
    }
    defer zipFile.Close()
    archive := zip.NewWriter(zipFile)
    defer archive.Close()
    filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
        if err !=nil{
            return err
        }

        header,err := zip.FileInfoHeader(info)
        if err !=nil{
            return err
        }
        header.Name = path
        if info.IsDir(){
            header.Name += "/"
        }else{
            header.Method = zip.Deflate
        }
        writer,err := archive.CreateHeader(header)
        if err !=nil{
            return err
        }
        if !info.IsDir(){
            file,err := os.Open(path)
            if err !=nil{
                return err
            }
            defer file.Close()

            _,err = io.Copy(writer,file)
        }
        return err
    })
    return err
}


//解壓縮
func Unzip(zipFile string,destDir string) error {
    zipReader ,err :=zip.OpenReader(zipFile)
    if err != nil{
        return err
    }
    defer zipReader.Close()
    for _,f := range zipReader.File{
        fpath := filepath.Join(destDir,f.Name)
        if f.FileInfo().IsDir(){
            os.MkdirAll(fpath,os.ModePerm)
        }else {
            if err = os.MkdirAll(filepath.Dir(fpath),os.ModePerm);err !=nil{
                return err
            }
            inFile,err := f.Open()  //這個是從壓縮文件讀取出來的
            if err !=nil{
                return err
            }
            defer inFile.Close()

            outFile,err := os.OpenFile(fpath,os.O_CREATE|os.O_WRONLY|os.O_TRUNC,f.Mode()) //創建的新文件
            if err !=nil{
                return err
            }
            defer outFile.Close()

            _,err = io.Copy(outFile,inFile)
        }
    }
    return err
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM