Golang windows下程序自动更新

本文介绍了如何使用Golang编写一个自动更新程序,适用于Windows平台。通过检查远程服务器上的版本信息,当发现新版本时,程序会下载更新文件并启动更新过程。更新过程中涉及文件复制和启动新的可执行文件来完成升级。
摘要由CSDN通过智能技术生成

// autoupdate

package autoupdate

 

import (

    "errors"

    "fmt"

    "io"

    "io/ioutil"

    "math/rand"

    "net/http"

    "os"

    "os/exec"

    "path/filepath"

    "strings"

    "time"

)

 

type AutoUpdate struct {

    Url string //下载路径

    Softname string //软件名

    CurrVer string //当前版本

    CurrName string //当前运行路径及文件名

}

 

func (au *AutoUpdate) Update() error {

    if strings.HasSuffix(au.CurrName, "update.exe") { //开始更新

        time.Sleep(3 * time.Second)

        if au.copyFile() {

            cmd := exec.Command("cmd", "/c", "start", filepath.Dir(au.CurrName)+"\\"+au.Softname+".exe")

            cmd.Start()

            cmd.Wait()

            os.Exit(0)

        }

    } else { //检测更新

        resp, err := http.Get(au.Url + "/" + au.Softname + ".txt?num=" + fmt.Sprintf("%d", rand.Intn(1000)))

        if err != nil {

            return err

        }

        defer resp.Body.Close()

        body, err := ioutil.ReadAll(resp.Body)

        if err != nil {

            return err

        }

        newVer := string(body)

        //      fmt.Println("远端版本号:", newVer)

        //      fmt.Println("本地版本号:", au.CurrVer)

        if newVer != au.CurrVer {

            if err := au.getNewVer(); err != nil {

                return err

            } else {

                cmd := exec.Command("cmd", "/c", "start", filepath.Dir(au.CurrName)+"\\update.exe")

                cmd.Start()

                cmd.Wait()

                os.Exit(0)

            }

        } else {

            os.Remove("update.exe")

        }

    }

    return nil

}

func (au *AutoUpdate) getNewVer() error {

    client := http.Client{Timeout: 900 * time.Second}

    resp, err := client.Get(au.Url + "/" + au.Softname + ".exe?num=" + fmt.Sprintf("%d", rand.Intn(1000)))

    if err != nil {

        return err

    }

    defer resp.Body.Close()

    if resp.Status == "200 OK" {

        newFile, err := os.Create("update.exe")

        if err != nil {

            return err

        }

        defer newFile.Close()

 

        _, err = io.Copy(newFile, resp.Body)

        if err != nil {

            return err

        }

        return nil

    } else {

        return errors.New(resp.Status)

    }

 

}

 

func (au *AutoUpdate) copyFile() bool {

    source_open, err := os.Open(au.CurrName)

    if err != nil {

        return false

    }

    defer source_open.Close()

    dest_open, err := os.OpenFile(filepath.Dir(au.CurrName)+"\\"+au.Softname+".exe", os.O_CREATE|os.O_WRONLY, 644)

    if err != nil {

        return false

    }

    defer dest_open.Close()

    //进行数据拷贝

    _, copy_err := io.Copy(dest_open, source_open)

    if copy_err != nil {

        return false

    } else {

        return true

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值