首页 > 解决方案 > 将可执行的 golang 文件复制到另一个文件夹

问题描述

我想知道是否可以将正在运行的 .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 flash。几毫秒后, 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})
}

标签: go

解决方案


我发现了一个错误。

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

我试图将 .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
}

推荐阅读