Go語言程式讀取並列印zip檔案中的所有檔案


Go語言擁有os、io和archive/zip等包,可用於讀取和列印zip檔案中的所有檔案。zip檔案是一組檔案/資料夾的壓縮集合。OS包用於執行復制操作,io包用於讀取和寫入操作,而archive/zip包用於解壓縮和壓縮檔案。本文將學習如何使用所有這些包來執行檔案的複製和解壓縮,並列印檔案內容。

方法1:使用io和os包

此程式使用archive/zip包讀取zip檔案的內容。它使用zip.OpenReader函式開啟zip檔案,該函式返回zip.ReadCloser型別。然後,它使用範圍迴圈遍歷存檔中的所有檔案,使用Open方法開啟每個檔案,並將檔名和內容列印到標準輸出。

語法

zip.OpenReader

此函式屬於archive/zip包。此函式的主要目的是開啟並讀取zip檔案的內容。它只接受一個輸入,即zip檔案。

演算法

  • 步驟1 − 建立一個名為main的包,並在程式中宣告fmt(格式化包)、os和io包,其中main生成可執行程式碼,fmt幫助格式化輸入和輸出。

  • 步驟2 − 在主選單中使用zip開啟zip檔案。使用OpenReader函式,然後將輸出放入變數read中。如果存在問題,列印錯誤訊息並重試。以便在函式完成時自動關閉,推遲read上的Close方法。

  • 步驟3 − 使用範圍迴圈和read.File欄位迭代zip包中的檔案。

  • 步驟4 − 然後,使用Open方法在每次迭代時開啟當前檔案,然後將結果儲存到變數v中。如果存在問題,列印錯誤訊息並重試。

  • 步驟5 − 為了確保在迴圈結束後自動關閉v,在v上使用close語句和defer關鍵字。

  • 步驟6 − 使用printf列印檔名,使用zip.File型別的Name欄位,並使用io.Copy將v的內容複製到輸出。

  • 步驟7 − 如果在列印檔名時出現錯誤,則在控制檯上列印錯誤。

示例

在本例中,我們將使用io和os包函式來執行程式。

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

func main() {
   // Open the zip file
   read, err := zip.OpenReader("folder.zip")
   if err != nil {
      fmt.Println(err)
      return
   }
   defer read.Close()

   // Iterate through the files in the zip archive
   for _, f := range read.File {
      // Open the current file
      v, err := f.Open()
      if err != nil {
         fmt.Println(err)
         return
      }
      defer v.Close()

      // Print the file name and contents
      fmt.Printf("File Name: %s\n", f.Name)
      _, err = io.Copy(os.Stdout, v)
      if err != nil {
         fmt.Println(err)
         return
      }
      fmt.Println()
   }
}

輸出

File1.txt
File2.txt

方法2:使用archive/zip和io/ioutil包

此程式與上一個示例非常相似,因為它使用io/ioutil包將檔案的內容讀入[]byte切片中,然後使用fmt.Printf將其顯示到標準輸出。

語法

ioutil.ReadAll 

此函式屬於ioutil包。使用它的主要目的是將檔案的內容讀入位元組切片中。它以檔名作為輸入。

演算法

  • 步驟1 − 建立一個名為main的包,並在程式中宣告fmt(格式化包)、archice/zip和io/ioutil包,其中main生成可執行程式碼,fmt幫助格式化輸入和輸出。

  • 步驟2 − 在主選單中使用zip開啟zip檔案。使用OpenReader函式,然後將輸出放入變數read中。如果存在問題,列印錯誤訊息並重試,以便在函式完成時自動關閉,推遲read上的Close方法。

  • 步驟3 − 使用範圍迴圈和read.File欄位迭代zip包中的檔案。

  • 步驟4 − 使用Open方法在每次迭代時開啟當前檔案,然後將結果儲存到變數v中。如果存在問題,列印錯誤訊息並重試。

  • 步驟5 − 為了確保在迴圈結束後自動關閉v,推遲v上的Close函式。

  • 步驟6 − 使用ioutil.ReadAll函式讀取檔案的內容,並將輸出放入變數b中。如果存在錯誤,則在控制檯上列印它。

  • 步驟7 − 然後,使用printf列印檔名及其內容,使用zip.File型別的Name欄位,並列印儲存在切片b中的檔案內容。

示例

在本例中,我們將使用io/ioutil和archive/zip包來執行程式。

package main
import (
   "archive/zip"
   "fmt"
   "io/ioutil"
)

func main() {
   // Open the zip file
   read, err := zip.OpenReader("sample.zip")
   if err != nil {
      fmt.Println(err)
      return
   }
   defer read.Close()

   // Iterate through the files in the zip archive
   for _, f := range read.File {
      // Open the current file
      v, err := f.Open()
      if err != nil {
         fmt.Println(err)
         return
      }
      defer v.Close()

      // Read the contents of the file
      b, err := ioutil.ReadAll(v)
      if err != nil {
         fmt.Println(err)
         return
      }

      // Print the file name and contents
      fmt.Printf("File Name: %s\n", f.Name)
      fmt.Printf("%s\n", string(b))
   }
}

輸出

File1.txt
File2.txt

結論

我們使用兩種方法執行了讀取和列印zip檔案中的檔案的程式。在第一種方法中,我們使用了io和os包,在第二種方法中,我們使用了archive/zip和io/ioutil包來執行程式。

更新於: 2023年2月22日

2K+ 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告