将可执行的golang文件复制到另一个文件夹

时间:2018-07-17 06:43:04

标签: go

我想知道是否可以将正在运行的.exe文件复制到另一个文件夹。我正在尝试使用Go中常用的复制方法来做到这一点。

func copy(src, dst string) error {
    in, err := os.Open(src)
    if err != nil {
        return err
    }
    defer in.Close()

    out, err := os.Create(dst)
    if err != nil {
        return err
    }
    defer out.Close()

    _, err = io.Copy(out, in)
    if err != nil {
        return err
    }
    return out.Close()
}

...

copyErr := copy(os.Args[0], "D:"+"\\"+"whs.exe")
if copyErr != nil {
    log.Panicf("copy -> %v", copyErr)
}

以相同大小复制的文件,但是我无法正确打开它。我只有快速的cmd闪光灯。几毫秒后,cmd关闭,我什至看不到任何错误。 我试图将错误写入日志文件,但它为空。

f, err := os.OpenFile("debug.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777)
if err != nil {
    log.Panicf("setLogOutput -> %v", err)
}
defer f.Close()

log.SetOutput(f)

如果我打开未复制的.exe文件,则一切正常。

我已将程序缩减为仅一种主要方法。结果是一样的。

func main() {
    log.Println("Starting...")
    copyErr := copy(os.Args[0], "F:"+"\\"+"whs.exe")
    if copyErr != nil {
        log.Panicf("copy -> %v", copyErr)
    }
    os.Stdin.Read([]byte{0})
}

1 个答案:

答案 0 :(得分:-2)

我发现了一个错误。

  

该进程无法访问该文件,因为该文件正在被另一个进程使用。

我试图将.exe文件复制到其自己的路径。

func copy(src, dst string) error {
    if _, err := os.Stat(dst); os.IsNotExist(err) {
        in, err := os.Open(src)
        if err != nil {
            return err
        }
        defer in.Close()

        out, err := os.Create(dst)
        if err != nil {
            return err
        }
        defer out.Close()

        _, err = io.Copy(out, in)
        if err != nil {
            return err
        }
    }
    return nil
}