golang 呼叫linux命令實現對zip的操作
阿新 • • 發佈:2019-01-08
好久沒寫文章了,實在是太忙。每週6天,早10晚10, 有時候晚上到11點。
哎,一把辛酸淚。
最近有個需求:我們做的是遊戲加速器。目前有上百個客戶,每個客戶需要有一個對應的zip包。按照以往的設計,可能就是每個客戶上傳一個zip,但是一個個的去上傳是不可能的,幾個客戶還好,多了的話上傳工作量急劇增加。
經部門老大提議:讓前端只用上傳一個zip(暫且稱為原始zip),再利用後臺上傳邏輯:在上傳的時候往這個原始zip裡面寫個xml的配置檔案,客戶端的程式去讀取zip裡面的xml,就能知道每個客戶自己對應的zip。
=====也就是在zip包裡面新增一個config.xml檔案,如果已經存在的,直接刪掉,重新新增config.xml
其實這個需求直接使用linux的zip 相關命令,兩行就可實現的。
使用zip命令裡面刪除指定的檔案
zip -d 壓縮包.zip 指定的檔名
使用zip命令新增指定檔案
zip -m 壓縮包.zip 指定的檔名
利用go自帶的os/exec包裡面的api,呼叫linux命令執行對zip的操作,直接上程式碼
// 刪除指定zip目錄下的指定檔案 func DeleteFileFromZip(zip, fileName string) (error) { cmd := exec.Command("zip", "-d", zip, fileName) logger.Info("向zip下刪除指定的檔案 DeleteFileFromZip", "zip", zip, "file", fileName) out, err := cmd.CombinedOutput() if err != nil { fmt.Println(err) logger.Error("刪除指定zip目錄下的指定檔案 DeleteFileFromZip 出錯", "err", err.Error(), "zip", zip) return errors.New("系統繁忙,請稍後再試") } fmt.Println(string(out)) logger.Info("刪除指定zip目錄下的指定檔案", "result", string(out)) return nil }
// 向zip下新增指定的檔案 func AddFile2Zip(zip, file string) (error) { //cmd := exec.Command("cd", basePath) // 首先在當前目錄下建立指定名稱的xml檔案 cmd := exec.Command("zip", "-m", zip, file) logger.Info("向zip下新增指定的檔案 AddFile2Zip", "zip", zip, "file", file) out, err := cmd.CombinedOutput() if err != nil { logger.Error("向zip下新增指定的檔案AddFile2Zip 出錯", "err", err.Error(), "zip", zip, "file", file) return errors.New("系統繁忙,請稍後再試") } logger.Info("向zip下新增指定的檔案", "result", string(out)) return nil }
這裡有個注意點:就是在操作zip壓縮包的時候,檔案應該首先存在,不可只給一個檔名。以上兩個func第一個引數都必須給出檔案的路徑地址。如果只有一個檔名,那麼會導致無法向zip新增檔案