dtsc14683 2018-07-17 06:43
浏览 359
已采纳

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

I wonder if possible to copy running .exe file to another folder. I am trying to do this using usual copy approach in Go like that.

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)
}

The file copied with the same size but I can't open it correctly. I have only a fast cmd flash. After several milliseconds, cmd is closing and I can't see even any errors. I was trying to write errors to log file but it's empty.

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)

If I open not copied .exe file everything works correctly.

I've reduced my program to only one main method. The result was the same.

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条回答 默认 最新

  • duanli6834 2018-07-17 12:23
    关注

    I have found an error.

    The process cannot access the file because it is being used by another process.

    I was trying to copy the .exe file to its own path.

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题