【问题标题】:How to delete self (executable file) in Windows?如何在 Windows 中删除自身(可执行文件)?
【发布时间】:2016-10-05 17:54:31
【问题描述】:
package main

import "os"

func main() {
    err := os.Remove(os.Args[1])
    if err != nil {
        panic(err)
    }
}

编译这个

GOOS=windows GOARCH=386 go build test.go

然后在葡萄酒上运行

Z:\tmp>test.exe test.exe
fixme:process:SetProcessPriorityBoost (0xffffffff,1): stub
panic: remove test.exe: Access denied.

goroutine 1 [running]:
panic(0x462c40, 0x5b3f9ca0)
    /usr/local/go/src/runtime/panic.go:500 +0x331
main.main()
    /tmp/test.go:8 +0x70

Z:\tmp>fixme:console:CONSOLE_DefaultHandler Terminating process 8 on event 0

我认为“好吧,这就是酒”,并在 VirtualBox 上的 Win XP 中运行。但这是 Windows 返回的错误。

//对不起我的英语。

【问题讨论】:

  • “拒绝访问”说明了一切。您正在运行该程序的用户不允许删除该文件。您无法删除可执行文件,因为它已被程序本身使用。
  • 在 Linux 中删除是成功的。似乎是特定于 Windows 的错误?
  • 有点。 linux 有一个 2 级文件描述符系统 - 您可以删除/替换正在使用的文件,原始文件将作为“幽灵”保留在任何积极使用它的进程中。 windows没有,所以你不能。
  • 感谢您的回答。

标签: windows go


【解决方案1】:

使用CreateProcess函数,可以使用syscall包在Go中编写:

package main

import (
    "fmt"
    "syscall"
    "os"
)

func main() {
    // write your code here 
    // <----
    fmt.Println("Blah Blah Blah")
    // ---->
    var sI syscall.StartupInfo
    var pI syscall.ProcessInformation
    argv := syscall.StringToUTF16Ptr(os.Getenv("windir")+"\\system32\\cmd.exe /C del "+os.Args[0])
    err := syscall.CreateProcess(
        nil,
        argv,
        nil,
        nil,
        true,
        0,
        nil,
        nil,
        &sI,
        &pI)
    if err != nil {
        fmt.Printf("Return: %d\n", err)
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多