Go 如何自動解壓縮包?
在開發過程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用 Go 語言自動解壓縮包和讀取 docx/doc 文件。
一、解壓縮包
壓縮包格式
常見的壓縮包格式有 zip、gzip、bzip2 等。在 Go 語言中,使用 archive/zip、compress/gzip、compress/bzip2 包可以輕鬆地處理這些格式的文件。
解壓 zip 文件
使用 archive/zip 包中的函數,我們可以輕鬆地操作 zip 文件。首先,我們需要打開 zip 文件:
zipFile, err := zip.OpenReader(zipPath)
if err != nil {
return err
}
defer zipFile.Close()
上面的代碼使用 zip.OpenReader 函數打開一個 zip 文件,並返回一個 * zip.ReadCloser 類型的對象,表示 zip 文件內容的讀取器和關閉器。注意:在讀取完 zip 文件後,記得使用 defer 語句關閉該文件。
接着,我們可以使用 Read() 函數來解壓 zip 文件中的每一個文件,並將其寫入到本地磁盤:
for _, zipFileInfo := range zipFile.Reader.File {
dstPath := filepath.Join(outputDir, zipFileInfo.Name)
dstDir := filepath.Dir(dstPath)
err = os.MkdirAll(dstDir, 0755)
if err != nil {
return err
}
dstFile, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, zipFileInfo.Mode())
if err != nil {
return err
}
srcFile, err := zipFileInfo.Open()
if err != nil {
dstFile.Close()
return err
}
_, err = io.Copy(dstFile, srcFile)
dstFile.Close()
srcFile.Close()
if err != nil {
return err
}
}
上面的代碼中,我們首先拼接出本地文件路徑,並創建其所在的目錄結構。接着,使用 os.OpenFile() 函數以寫入模式打開本地文件,並使用 zipFileInfo.Mode() 函數獲取 zip 文件中該文件的權限信息。使用 zipFileInfo.Open() 函數將 zip 文件中的文件打開,並使用 io.Copy() 函數將其寫入到本地文件中。如果出現任何錯誤,記得關閉本地文件和 zip 文件中的文件,以便資源得以正確釋放。
解壓 gzip 文件
使用 compress/gzip 包,我們也可以輕鬆地解壓 gzip 文件。具體方法如下:
gzipFile, err := os.Open(gzipPath)
if err != nil {
return err
}
defer gzipFile.Close()
gzipReader, err := gzip.NewReader(gzipFile)
if err != nil {
return err
}
defer gzipReader.Close()
dstPath := filepath.Join(outputDir, filepath.Base(gzipPath))
dstFile, err := os.OpenFile(dstPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
return err
}
defer dstFile.Close()
_, err = io.Copy(dstFile, gzipReader)
if err != nil {
return err
}
上面的代碼首先打開 gzip 文件,並使用 gzip.NewReader() 函數創建一個 gzip.Reader 類型的對象,表示 gzip 文件內容的讀取器。記得在讀取完該文件之後關閉相關文件(即:gzip 文件和讀取器文件)。然後,通過使用 os.OpenFile() 函數以寫入模式打開目標文件,並將 gzip 讀取器中的內容複製到目標文件中即可。記得在操作完目標文件後關閉相關文件,以便資源成功釋放。
解壓 bzip2 文件
使用 compress/bzip2 包,可以輕鬆地解壓 bzip2 文件。方法如下:
bzip2File, err := os.Open(bzip2Path)
if err != nil {
return err
}
defer bzip2File.Close()
bzip2Reader := bzip2.NewReader(bzip2File)
dstPath := filepath.Join(outputDir, filepath.Base(bzip2Path))
dstFile, err := os.OpenFile(dstPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
return err
}
defer dstFile.Close()
_, err = io.Copy(dstFile, bzip2Reader)
if err != nil {
return err
}
上面的代碼中,我們使用 bzip2.NewReader() 函數創建一個 bzip2.Reader 類型的對象,表示 bzip2 文件內容的讀取器。然後,以寫入模式打開目標文件,將讀取器中的內容複製到目標文件中,並在完成後關閉相關文件,釋放資源。
二、讀取 docx/doc 文件
docx/doc 文件是一種二進制文件格式,我們可以使用第三方庫來讀取其中的內容。Word 文檔通常使用. doc 或. docx 格式保存,其中. doc 是二進制格式,而. docx 則是 XML 格式的文件。接下來,我們將分別介紹如何讀取這兩種文件格式的內容。
讀取. doc 格式文件
我們可以使用 github.com/LopPay/office-parser/ole、github.com/LopPay/office-parser/common 和 github.com/LopPay/office-parser/msdoc 分別來處理 ole 文件、解析 doc 文件和讀取 doc 文件中的數據。該庫已經封裝了所有的文本、圖片、表格等元素的解析和轉換。
下面是一個簡單的讀取 doc 文件的程序:
docFile, err := os.Open(docPath)
if err != nil {
return err
}
defer docFile.Close()
docData, err := msdoc.ParseDocFile(docFile)
if err != nil {
return err
}
for _, para := range docData.Paragraphs {
for _, run := range para.Runs {
fmt.Print(run.Text)
}
fmt.Println()
}
上面的代碼中,我們首先使用 os.Open() 函數打開 doc 文件,並使用 msdoc.ParseDocFile() 函數解析該文件。該函數返回一個 msdoc.Document 類型的對象,該對象包括文本、圖片、表格等信息。下面的代碼將遍歷每一個段落和其中的 Run 實例,並將其內容輸出到控制檯。
讀取. docx 格式文件
我們可以使用第三方庫 github.com/unidoc/unioffice 來讀取. docx 格式的文件。該庫支持讀取和寫入單個文件、讀取和寫入多個文件、轉換和操作表格、圖像、段落、樣式等操作。
下面是一個簡單的讀取. docx 文件的程序:
docFile, err := os.Open(docxPath)
if err != nil {
return err
}
defer docFile.Close()
doc, err := document.Open(docFile)
if err != nil {
return err
}
for _, para := range doc.Paragraphs() {
for _, run := range para.Runs() {
fmt.Print(run.Text())
}
fmt.Println()
}
上面的代碼中,我們首先使用 os.Open() 函數打開 docx 文件,並使用 document.Open() 函數解析該文件。該函數返回一個 document.Document 類型的對象,該對象包括文本、圖片、表格等信息。下面的代碼將遍歷每一個段落和其中的 Run 實例,並將其內容輸出到控制檯。
三、總結
本文介紹瞭如何使用 Go 語言自動解壓縮包和讀取 docx/doc 文件。具體來說,我們使用了相應的第三方庫和 Go 語言內置庫中的代碼。
上述代碼運行起來比較簡單,適合初學者學習和實踐。希望對大家有幫助,大家可以自行根據需求進行修改和擴展。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/fkRNfG6xZSkn-B-eKRBgSg