我想知道是否可以将正在运行的.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})
}
答案 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
}