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包來執行程式。