1. 程式人生 > >golang 呼叫linux命令實現對zip的操作

golang 呼叫linux命令實現對zip的操作

好久沒寫文章了,實在是太忙。每週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新增檔案