好久没写文章了,实在是太忙。每周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添加文件