」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 zip 套件輕鬆解壓縮 Go 中的檔案?

如何使用 zip 套件輕鬆解壓縮 Go 中的檔案?

發佈於2024-11-17
瀏覽:450

How to Easily Unzip Files in Go with the `zip` Package?

使用 Go 輕鬆解壓縮

使用 zip 包,在 Go 中解壓縮檔案變得輕而易舉。它的簡單性允許您創建如下所示的實用函數:

func Unzip(src, dest string) error {
    r, err := zip.OpenReader(src)
    if err != nil {
        return err
    }
    defer func() {
        if err := r.Close(); err != nil {
            panic(err)
        }
    }()

    os.MkdirAll(dest, 0755)

    // Closure isolates file descriptor .Close() calls
    extractAndWriteFile := func(f *zip.File) error {
        rc, err := f.Open()
        if err != nil {
            return err
        }
        defer func() {
            if err := rc.Close(); err != nil {
                panic(err)
            }
        }()

        path := filepath.Join(dest, f.Name)

        // Prevent ZipSlip vulnerability
        if !strings.HasPrefix(path, filepath.Clean(dest) string(os.PathSeparator)) {
            return fmt.Errorf("illegal file path: %s", path)
        }

        if f.FileInfo().IsDir() {
            os.MkdirAll(path, f.Mode())
        } else {
            os.MkdirAll(filepath.Dir(path), f.Mode())
            f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
            if err != nil {
                return err
            }
            defer func() {
                if err := f.Close(); err != nil {
                    panic(err)
                }
            }()

            _, err = io.Copy(f, rc)
            if err != nil {
                return err
            }
        }
        return nil
    }

    for _, f := range r.File {
        err := extractAndWriteFile(f)
        if err != nil {
            return err
        }
    }

    return nil
}

此程式碼精心迭代 zip 檔案中的每個文件,適當處理目錄和常規文件,同時確保文件路徑的有效性。請注意,閉包方法消除了不必要的延遲堆疊,增強了封裝性,並簡化了錯誤處理。

最新教學 更多>
  • 如何在 PHP 中提取不含副檔名的檔名?
    如何在 PHP 中提取不含副檔名的檔名?
    在PHP 中提取不帶擴展名的文件名使用神奇常數__FILE__ 可以輕鬆獲取PHP 中當前執行腳本的文件名。但是,如果您需要提取不含副檔名的檔案名,例如“.php”後綴,則過程略有不同。 basename() 解決方案:若要使用basename()函數刪除副檔名,您可以:basename(__FIL...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 和 MySQL 中同步時區?
    如何在 PHP 和 MySQL 中同步時區?
    在PHP 和MySQL 中同步時區您正在開發一個需要使用PHP date() 函數在MySQL 中儲存日期的應用程式。有必要使用 NOW() 在 MySQL 中比較這些日期來計算時間差異。但是,PHP date() 函數使用 PHP 中定義的時區,而 NOW() 使用 MySQL 伺服器中配置的時區...
    程式設計 發佈於2024-11-17
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-17
  • 如何使用準備好的語句在 PHP MySQLi 中準備安全更新查詢?
    如何使用準備好的語句在 PHP MySQLi 中準備安全更新查詢?
    如何為更新查詢準備語句為了增強使用PHP MySQLi 查詢更新資料庫時的資料安全性,建議採用準備好的聲明。雖然 PHP 文件提供了有關 bind_param() 的信息,但它缺少特定於更新查詢的範例。 讓我們深入研究如何為更新查詢制定準備好的語句:準備查詢語句:將更新查詢中的所有變數替換為問題標記...
    程式設計 發佈於2024-11-17
  • 如何將文字保留在圓角 Div 內?
    如何將文字保留在圓角 Div 內?
    確保文字保留在圓角Div 內在創建具有引人入勝的視覺元素的網頁時,通常會遇到圓角的需求無縫整合文字內容的div。然而,預設情況下,圓形 div 內的文字往往表現為其容器是方形的,超出了指定的圓形邊界。 為了解決此問題,有許多解決方案,每種解決方案都有自己的優點和優勢限制:1。 Shape-Outsi...
    程式設計 發佈於2024-11-17
  • **擴充語法與其餘參數:ES2015 中的差異是什麼?
    **擴充語法與其餘參數:ES2015 中的差異是什麼?
    擴展語法與剩餘參數:揭開ES2015 中的差異瀏覽ES2015 中擴展語法和剩餘參數的細微差別可能是一個想法-令人難以置信的努力。在本指南中,我們將剖析它們在 JavaScript 不斷發展的格局中的對比角色。 理解擴展語法:從一到多擴展語法(以' 表示) ...')允許我們將可迭代...
    程式設計 發佈於2024-11-17
  • 為什麼我的 Tomcat 伺服器顯示「所需的幾個連接埠已在使用中」?
    為什麼我的 Tomcat 伺服器顯示「所需的幾個連接埠已在使用中」?
    Tomcat 伺服器連接埠衝突:解決錯誤「Several Ports required are Already in Use」嘗試在Tomcat 上啟動JSP 程式時Eclipse 中,使用者可能會遇到錯誤,指出Tomcat 所需的多個連接埠已在使用中。出現此問題的原因是存在另一個 Tomcat 實...
    程式設計 發佈於2024-11-17
  • 如何在 Java 中確定文件建立日期?
    如何在 Java 中確定文件建立日期?
    在Java 中確定文件創建日期:揭示文件元數據確定文件的創建日期可能是一條有價值的信息,尤其是組織和管理文件時。 Java 提供了存取此元資料的機制,只要底層檔案系統支援即可。 Java 中的檔案建立日期Java NIO(新輸入/輸出)提供用於擷取檔案元資料的選項,包括建立時間。透過利用 Basic...
    程式設計 發佈於2024-11-17
  • 我們如何在 C/C++ 中實作鋸齒狀數組?
    我們如何在 C/C++ 中實作鋸齒狀數組?
    理解C/C 中的交錯數組雖然交錯數組的概念(其中行可以有不同的長度)在標準C/ C ,有一些技術可以實現類似的功能。 在嘗試在C/C 中宣告交錯數組時,如圖所示:int jagged[][] = { {0,1}, {1,2,3} };編譯器出錯,突顯指定的要求除第一個維度外的所有維度的邊界。為了克服...
    程式設計 發佈於2024-11-17
  • 如何在 Sublime Text 2 中取得使用者輸入?
    如何在 Sublime Text 2 中取得使用者輸入?
    Sublime Text 2 中的使用者輸入使用者嘗試在Sublime Text 2 中輸入值時遇到困難,特別是在Python 中使用input() 或gets等函數時紅寶石。控制台不提示輸入,導致出現 EOFError 之類的錯誤。 此問題是由於 Sublime Text 2 缺乏控制台輸入的原生...
    程式設計 發佈於2024-11-17
  • 如何執行儲存在 MySQL 資料庫中的 PHP 程式碼?
    如何執行儲存在 MySQL 資料庫中的 PHP 程式碼?
    執行儲存在 MySQL 資料庫中的 PHP執行儲存在 MySQL 資料庫中的 PHP 為 Web 開發帶來了獨特的挑戰。要執行此操作,您可以使用 PHP 中內建的 eval() 函數。 eval() 函數eval() 函數計算給定的字串作為 PHP 程式碼。它執行解析後的程式碼,就像直接在腳本中編寫...
    程式設計 發佈於2024-11-17
  • 如何處理 PHP 8.1 中的回傳類型衝突?
    如何處理 PHP 8.1 中的回傳類型衝突?
    參考:返回類型衝突與#[\ReturnTypeWillChange] 屬性上下文:在PHP 8.1 中,指定返回類型方法變得更加普遍,導致與現有實現發生衝突。 問題:當方法的返回類型從相容類型更改為不相容型別或未指定時,以下棄用出現通知:Deprecated: Return type of [Met...
    程式設計 發佈於2024-11-17
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-17
  • How to Correctly Transfer Files Over Sockets in Java?
    How to Correctly Transfer Files Over Sockets in Java?
    Java file transfer over sockets involves converting files into byte arrays, sending them via the socket, and converting them back into files at the receiving end. To address issues encountered during implementation, this article provides corrected server
    程式設計 發佈於2024-11-17
  • 為什麼要使用「enableReaderMode」 API 將 NDEF 記錄寫入 NFC 標籤?
    為什麼要使用「enableReaderMode」 API 將 NDEF 記錄寫入 NFC 標籤?
    如何將NDEF 記錄寫入NFC 標籤將NDEF 記錄寫入NFC 標籤需要使用enableReaderMode API,該API 提供卓越的效能和與基於意圖的系統相比的可靠性。透過處理讀寫過程而不是依賴系統的預設行為,寫入失敗和卡片損壞的風險顯著降低。 使用enableReaderMode API的主...
    程式設計 發佈於2024-11-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3