欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Golang生成壓縮文件的詳細(xì)教程

 更新時間:2024年01月30日 10:48:33   作者:夢想畫家  
與其他語言一樣,內(nèi)置標(biāo)準(zhǔn)庫默認(rèn)支持文件壓縮功能,本文介紹Golang如何創(chuàng)建壓縮文件,增加一個或多個文件生成壓縮文件,也可以在壓縮文件中創(chuàng)建文件夾,用于對文件進(jìn)行分類管理,Golang標(biāo)準(zhǔn)庫 archive/zip提供了創(chuàng)建和讀取壓縮文件功能,需要的朋友可以參考下

這是一個簡單的golang壓縮文件小案例,可做很多的拓展,這里使用的庫是archive/zip,在gopkg里面搜zip就行。

方法一

使用gin框架,獲取前端傳過來的文件壓縮成zip,存儲路徑入數(shù)據(jù)庫中,代碼簡單示例如下:

@Param file formData file true "上傳文件"
func UploadToZip(c *gin.Context){
	//獲取前端傳過來的文件,如果有多個文件: 使用form,_ := c.MultipartForm()
	//files := form.File["file"]
	//然后遍歷files拿到每個文件
	file,err := c.FormFile("file")
	if err != nil {
		response.Fail("參數(shù)有誤",c)
		return
	}
	//創(chuàng)建目錄和指定文件名
	err = c.SaveUploadedFile( file ,"files/" + file + file.Filename)
	if err != nil {
		response.Fail("存儲文件失敗",c)
		return
	}
	//在指定的目錄生成你要的zip文件
	create, err  := os.Create("flies/dome.zip")
	defer create.Close()
	if err != nil {
		response.Fail("創(chuàng)建失敗",c)
		retuen
	}
	//創(chuàng)建一個zip流
	writer := zip.NewWriter(create)
	defer writer.Close()
	//讀取存儲的目錄,將里面的文件壓縮
	readFile ,err := os.ReadDir("files")
	if err != nil {
		response.Fail("讀取文件失敗",c)
		retuen
	}
	//遍歷目錄,獲取單個文件
	for _,rf := range readFile {
		//只壓縮文件,目錄不做壓縮
		if !rf.IsDir() {
			//打開要壓縮的文件
			open,err := os.Open("flies" + rf.Name())
			if err != nil {
				response.Fail("打開文件失敗",c)
				retuen
			}
			//創(chuàng)建一個壓縮包里面的文件和文件名,這樣解壓后會有一個files目錄,目錄里面有壓縮的文件
			f, _ := writer.Create("flies" + rf.Name())
			//將文件壓縮成zip
			if _,err := io.Copy(f,open);err != nil {
				response.Fail("壓縮失敗",c)
				retuen
			}
		}
	}
	//將壓縮路徑存放數(shù)據(jù)庫
	...
	response.OK("壓縮成功",c)
}

方法二

壓縮實(shí)現(xiàn)過程

創(chuàng)建壓縮歸檔文件

首先需要創(chuàng)建歸檔文件,與其他普通文件一樣。使用os包的os.Create函數(shù):

func Create(name string) (*File, error)

該方法創(chuàng)建或刪除給定名稱文件。如果文件已存在則刪除重新創(chuàng)建,如果不存在,創(chuàng)建文件,模式為0666。創(chuàng)建成功返回File用于讀寫,關(guān)聯(lián)文件描述符為O_RDWR,反之報錯,類型為*PathError。

初始化歸檔文件zip.Writer

使用 archive/zip 包 中的zip.NewWriter 函數(shù),用于寫數(shù)據(jù)(文件或目錄)至最終的壓縮文件。
語法如下:

func NewWriter(w io.Writer) *Writer

NewWriter 返回Writer寫

使用zip.Writer.Create增加文件壓縮文件

上面已創(chuàng)建了zip.Writer,可以增加文件和目錄至壓縮文件,使用zip.Writer.Create函數(shù):

func (w *Writer) Create(name string) (io.Writer, error)

方法通過文件名稱增加文件至壓縮文件,返回Writer用于寫文件內(nèi)容,文件內(nèi)容將被壓縮。文件名稱必須為相對路徑,不能以驅(qū)動器字母(C:)或斜杠開頭,僅允許正斜杠。如果增加目錄,需要在名稱后面增加尾斜杠。在下一次調(diào)用Create, CreateHeader, 或 Close方法之前,文件內(nèi)容必須被寫入io.Writer.

使用 io.Copy 或 io.Writer.Write 寫文件內(nèi)容

zip.Writer.Create返回io.Writer,用于寫數(shù)據(jù),所以任何文件內(nèi)容可以流入或?qū)懭朐揥riter,也可以使用io.Copy函數(shù)。

func Copy(dst Writer, src Reader) (written int64, err error)

Copy函數(shù)從src至dst,直達(dá)EOF或遇到錯誤。返回拷貝的字節(jié)數(shù)以及錯誤(如果有錯誤發(fā)生)。

使用zip.Writer.Close關(guān)閉壓縮文件

所有文件和目錄寫入至壓縮文件后,需要通過zip.Writer.Close方法關(guān)閉寫生成壓縮文件,即寫所有數(shù)據(jù)至底層數(shù)據(jù)流。

func (w *Writer) Close() error

實(shí)例代碼

下面示例壓縮兩個文件(txt和csv文件)生成單個壓縮文件。這兩個文件分別在壓縮文件的不同子目錄中。

package main

import (
    "archive/zip"
    "fmt"
    "io"
    "os"
)

func main() {
    fmt.Println("creating zip archive...")
    archive, err := os.Create("archive.zip")
    if err != nil {
        panic(err)
    }
    defer archive.Close()
    zipWriter := zip.NewWriter(archive)

    fmt.Println("opening first file...")
    f1, err := os.Open("test.csv")
    if err != nil {
        panic(err)
    }
    defer f1.Close()

    fmt.Println("writing first file to archive...")
    w1, err := zipWriter.Create("csv/test.csv")
    if err != nil {
        panic(err)
    }
    if _, err := io.Copy(w1, f1); err != nil {
        panic(err)
    }

    fmt.Println("opening second file")
    f2, err := os.Open("test.txt")
    if err != nil {
        panic(err)
    }
    defer f2.Close()

    fmt.Println("writing second file to archive...")
    w2, err := zipWriter.Create("txt/test.txt")
    if err != nil {
        panic(err)
    }
    if _, err := io.Copy(w2, f2); err != nil {
        panic(err)
    }
    fmt.Println("closing zip archive...")
    zipWriter.Close()
}

運(yùn)行程序,生成日志:

creating zip archive...
opening first file...
writing first file to archive...
opening second file
writing second file to archive...
closing zip archive...

最后解壓壓縮文件,和我們期望的一致:

$ unzip -l archive.zip
Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       50  1980-00-00 00:00   csv/test.csv
       16  1980-00-00 00:00   txt/test.txt
---------                     -------
       66                     2 files

總結(jié)

以上就是使用Golang生成壓縮文件的詳細(xì)教程的詳細(xì)內(nèi)容,更多關(guān)于Golang生成壓縮文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang 格式化輸入輸出操作

    golang 格式化輸入輸出操作

    這篇文章主要介紹了golang 格式化輸入輸出操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang的循環(huán)語句和循環(huán)控制語句詳解

    Golang的循環(huán)語句和循環(huán)控制語句詳解

    循環(huán)語句為了簡化程序中有規(guī)律的重復(fù)性操作,需要用到循環(huán)語句,和其他大多數(shù)編程語言一樣,GO的循環(huán)語句有for循環(huán),不同的是沒有while循環(huán),而循環(huán)控制語句可以改變循環(huán)語句的執(zhí)行過程,下面給大家介紹下go循環(huán)語句和循環(huán)控制語句的相關(guān)知識,一起看看吧
    2021-11-11
  • Go Gin實(shí)現(xiàn)文件上傳下載的示例代碼

    Go Gin實(shí)現(xiàn)文件上傳下載的示例代碼

    這篇文章主要介紹了Go Gin實(shí)現(xiàn)文件上傳下載的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • go語言 swagger 查詢 json 字段注釋的示例代碼

    go語言 swagger 查詢 json 字段注釋的示例代碼

    在Go語言中,使用Swagger通過swag工具和gin-gonic框架生成API文檔,涉及引入依賴、定義模型、添加注釋等步驟,示例中展示了如何為接受查詢參數(shù)的API端點(diǎn)添加注釋,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動態(tài)庫

    Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動態(tài)庫

    這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動態(tài)庫,Golang?程序在運(yùn)行時加載C動態(tài)庫的技術(shù),跳過了Golang項目編譯階段需要鏈接C動態(tài)庫的過程,提高了Golang項目開發(fā)部署的靈活性
    2022-07-07
  • MacOS下本地golang環(huán)境搭建詳細(xì)教程

    MacOS下本地golang環(huán)境搭建詳細(xì)教程

    這篇文章主要介紹了MacOS下本地golang環(huán)境搭建詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Golang常用的幾種密碼加密方式分享

    Golang常用的幾種密碼加密方式分享

    這篇文章給大家介紹了Golang常用的幾種密碼加密方式,加密有兩種方式,一種是直接加密,一種是鹽值加密,直接加密指的是將原始密碼直接進(jìn)行加密,鹽值加密則是在進(jìn)行密碼加密之前,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • 一文帶你感受Go語言空結(jié)構(gòu)體的魔力

    一文帶你感受Go語言空結(jié)構(gòu)體的魔力

    在?Go?語言中,有一種特殊的用法可能讓許多人感到困惑,那就是空結(jié)構(gòu)體,本文將對Go空結(jié)構(gòu)體進(jìn)行詳解,準(zhǔn)備一杯你最喜歡的飲料或茶,隨著本文一探究竟吧
    2023-05-05
  • Golang性能優(yōu)化的技巧分享

    Golang性能優(yōu)化的技巧分享

    性能優(yōu)化的前提是滿足正確可靠、簡潔清晰等質(zhì)量因素,針對?Go語言特性,本文為大家整理了一些Go語言相關(guān)的性能優(yōu)化建議,感興趣的可以了解一下
    2023-07-07
  • go語言 xorm框架 postgresql 的用法及詳細(xì)注解

    go語言 xorm框架 postgresql 的用法及詳細(xì)注解

    這篇文章主要介紹了go語言 xorm框架 postgresql 的用法及詳細(xì)注解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論