最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang壓縮與解壓縮文件的示例代碼

 更新時(shí)間:2024年02月07日 09:43:49   作者:ProblemTerminator  
這篇文章主要給大家介紹了golang壓縮與解壓縮文件,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

壓縮

入口壓縮函數(shù)

useBasePathInZip參數(shù):

為 false 相當(dāng)于全文件視圖,zip中沒(méi)有目錄
為 true表示保留源文件的路徑(srcPaths如果是相對(duì)路徑,則壓縮后zip文件中也是相對(duì)路徑)

func compress(srcPaths []string, outputPath string, useBasePathInZip bool) {
    if len(srcPaths) == 0 {
        return
    }
 
    file, openErr := os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
    if openErr != nil {
        fmt.Printf("failed to open file %s: %v\n", outputPath, openErr)
        return
    }
    defer file.Close()
 
    zipWriter := zip.NewWriter(file)
    defer zipWriter.Close()
 
    for _, path := range srcPaths {
        
        info, err := os.Stat(path)
        if err != nil {
            fmt.Printf("failed to stat file %s: %v\n", path, err)
            return
        }
 
        if info.IsDir() {
            fmt.Printf("%s is dir...\n", path)
            err = addFilesToDirectory(zipWriter, path, "", useBasePathInZip)
            if err != nil {
                return
            }
 
            continue
        }
 
        fmt.Printf("%s is file...\n", path)
        if err = compressFile(zipWriter, path, useBasePathInZip); err != nil {
            log.Fatalf("add file %s to zip failed: %s", path, err)
        }
    }
}

核心處理

遞歸壓縮目錄中的所有文件

func addFilesToDirectory(zw *zip.Writer, newDir, baseInZip string, useBasePathInZip bool) error {
    files, err := ioutil.ReadDir(newDir)
    if err != nil {
        return err
    }
 
    fmt.Printf("目錄 %s 下包含 %d 個(gè)對(duì)象.\n", newDir, len(files))
 
    var newBaseInZip string
    for _, fileInfo := range files {
        if useBasePathInZip {
            newBaseInZip = filepath.Join(baseInZip, fileInfo.Name())
        }
 
        newFullPath := filepath.Join(newDir, fileInfo.Name())
 
        fmt.Printf("\tcheck filename=%s, newFullPath=%s, newBaseInZip=%s \n", fileInfo.Name(), newFullPath, newBaseInZip)
 
        // 是目錄,遞歸處理
        if fileInfo.IsDir() {
            if err = addFilesToDirectory(zw, newFullPath, newBaseInZip, useBasePathInZip); err != nil {
                return err
            }
 
            continue
        }
 
        // 處理單個(gè)文件
        if err = compressFile(zw, newFullPath, useBasePathInZip); err != nil {
            return err
        }
    }
 
    return nil
}

壓縮單個(gè)文件

func compressFile(zw *zip.Writer, srcFile string, useBasePathInZip bool) error {
    fileToZip, err := os.Open(srcFile)
    if err != nil {
        log.Fatalf("compressFile failed to open %s: %v", srcFile, err)
        return err
    }
    defer fileToZip.Close()
 
    var zipFile io.Writer
 
    if !useBasePathInZip {
        // 獲得源文件FileInfo對(duì)象
        info, err := fileToZip.Stat()
        if err != nil {
            fmt.Printf("failed to open file %s: %v\n", srcFile, err)
            return err
        }
 
        // 創(chuàng)建新的ZIP文件頭,并設(shè)置其內(nèi)部路徑僅為文件名
        header, err := zip.FileInfoHeader(info)
        if err != nil {
            fmt.Printf("failed to create file header for %s: %v\n", srcFile, err)
            return err
        }
 
        fmt.Println("名稱(chēng)=", header.Name)
 
        // 設(shè)置壓縮后的文件名為源文件名(去掉路徑)
        header.Name = filepath.Base(srcFile)
        
        // 基于主zw流創(chuàng)建該文件的目標(biāo)zip平臺(tái)
        zipFile, err = zw.CreateHeader(header)
        if err != nil {
            return err
        }
    } else {
        zipFile, err = zw.Create(srcFile)
        if err != nil {
            return err
        }
    }
 
    // 將源文件Copy到目標(biāo)zip平臺(tái)
    _, err = io.Copy(zipFile, fileToZip)
 
    fmt.Printf("壓縮 %s 完成 %v\n", srcFile, err)
    return err
}

調(diào)用壓縮

func main() {
    var srcPaths = []string{"fzip/zipt/a.txt", "fzip/unzip.go"}
    compress(srcPaths, "./a.zip", true)
}

解壓縮

func unzip(unzipFile, unzipDir string) {
    zipReader, _ := zip.OpenReader(unzipFile)
    for i, file := range zipReader.Reader.File {
 
        fmt.Printf("正在壓縮第 %d 個(gè). name=%s Comment=%s, isDir=%v, size=%d.\n", i+1, file.Name, file.Comment, file.FileInfo().IsDir(), file.FileInfo().Size())
 
        func(i int, file *zip.File) {
            zippedFile, err := file.Open()
            if err != nil {
                log.Fatal(err)
            }
            defer zippedFile.Close()
 
            extractedFilePath := filepath.Join(unzipDir, file.Name)
 
            if file.FileInfo().IsDir() {
                _ = os.MkdirAll(extractedFilePath, file.Mode()) // 權(quán)限不變
                fmt.Println("dir Created:", extractedFilePath)
                return
            }
 
            fmt.Println("file extracted: ", file.Name)
 
            func() {
                outputFile, err := os.OpenFile(extractedFilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
 
                if err != nil {
                    log.Fatal(err)
                }
                defer outputFile.Close()
 
                _, err = io.Copy(outputFile, zippedFile)
                if err != nil {
                    log.Fatal(err)
                }
            }()
 
        }(i, file)
 
    }
}

到此這篇關(guān)于golang壓縮與解壓縮文件的示例代碼的文章就介紹到這了,更多相關(guān)golang壓縮與解壓縮文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于微服務(wù)框架go-micro開(kāi)發(fā)gRPC應(yīng)用程序

    基于微服務(wù)框架go-micro開(kāi)發(fā)gRPC應(yīng)用程序

    這篇文章介紹了基于微服務(wù)框架go-micro開(kāi)發(fā)gRPC應(yīng)用程序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Go語(yǔ)言中的函數(shù)、閉包、defer、錯(cuò)誤處理的學(xué)習(xí)教程

    Go語(yǔ)言中的函數(shù)、閉包、defer、錯(cuò)誤處理的學(xué)習(xí)教程

    Go語(yǔ)言中函數(shù)包含func關(guān)鍵字、函數(shù)名、參數(shù)列表和返回值列表,Go支持普通函數(shù)、匿名函數(shù)和閉包,值傳遞是Go語(yǔ)言中所有函數(shù)參數(shù)的傳遞方式,defer語(yǔ)句用于延遲函數(shù)的執(zhí)行,適合用于資源清理,Go的錯(cuò)誤處理主要通過(guò)error接口、panic函數(shù)和recover函數(shù)來(lái)實(shí)現(xiàn),鼓勵(lì)顯式錯(cuò)誤處理
    2026-01-01
  • Go語(yǔ)言開(kāi)發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解

    Go語(yǔ)言開(kāi)發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解

    這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 一個(gè)簡(jiǎn)單的Golang實(shí)現(xiàn)的HTTP Proxy方法

    一個(gè)簡(jiǎn)單的Golang實(shí)現(xiàn)的HTTP Proxy方法

    今天小編就為大家分享一篇一個(gè)簡(jiǎn)單的Golang實(shí)現(xiàn)的HTTP Proxy方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Go如何實(shí)現(xiàn)HTTP請(qǐng)求限流示例

    Go如何實(shí)現(xiàn)HTTP請(qǐng)求限流示例

    本篇文章主要介紹了Go如何實(shí)現(xiàn)HTTP請(qǐng)求限流示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Golang實(shí)現(xiàn)單鏈表的示例代碼

    Golang實(shí)現(xiàn)單鏈表的示例代碼

    本文主要介紹了Golang實(shí)現(xiàn)單鏈表的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang內(nèi)存管理之內(nèi)存分配器詳解

    Golang內(nèi)存管理之內(nèi)存分配器詳解

    Go內(nèi)存分配器的設(shè)計(jì)思想來(lái)源于TCMalloc,全稱(chēng)是Thread-Caching?Malloc,核心思想是把內(nèi)存分為多級(jí)管理,下面就來(lái)和大家深入聊聊Go語(yǔ)言?xún)?nèi)存分配器的使用吧
    2023-06-06
  • Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解

    Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解

    這篇文章主要為大家介紹了Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 從基礎(chǔ)到高級(jí)全方位解析Go中反射的應(yīng)用

    從基礎(chǔ)到高級(jí)全方位解析Go中反射的應(yīng)用

    本文我們將全面深入地探討Go語(yǔ)言的反射機(jī)制,從反射的基礎(chǔ)概念、為什么需要反射,到如何在Go中實(shí)現(xiàn)反射,以及在高級(jí)編程場(chǎng)景如泛型編程和插件架構(gòu)中的應(yīng)用,需要的可以參考下
    2023-10-10
  • GPT回答go語(yǔ)言和C語(yǔ)言map操作方法對(duì)比

    GPT回答go語(yǔ)言和C語(yǔ)言map操作方法對(duì)比

    這篇文章主要為大家介紹了GPT回答go語(yǔ)言和C語(yǔ)言map操作方法對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論

南通市| 达拉特旗| 关岭| 宝坻区| 鲁甸县| 麦盖提县| 北流市| 武安市| 越西县| 大连市| 正镶白旗| 铜梁县| 弥渡县| 浦东新区| 乐安县| 鄂托克旗| 水富县| 柯坪县| 上饶市| 常熟市| 高碑店市| 合肥市| 纳雍县| 河北省| 武安市| 台南县| 临安市| 高密市| 双城市| 棋牌| 牙克石市| 论坛| 西昌市| 获嘉县| 登封市| 建德市| 安塞县| 吐鲁番市| 保亭| 石河子市| 赣州市|