2009-10-22 76 views
21

运行中的进程是否可以删除自己的可执行文件?程序如何删除自己的可执行文件

例如,我制作了一个控制台应用程序(单个exe文件),并在完成一些任务后以某种方式删除了exe文件。

我必须发送一个文件给某人。我希望它在完成预定任务后将其删除。

反正有做到这一点在Windows

+1

我找到了最适合我的文章http://www.catch22.net/tuts/selfdel。 – ata 2009-10-26 05:48:53

回答

2

您可以运行其他应用程序,它会等待父进程终止,然后删除其可执行文件。

+3

然后删除删除其他应用程序的应用程序是什么? – PAULDAWG 2017-07-05 23:35:23

16

执行此操作的一种方法是将MoveFileEx函数与MOVEFILE_DELAY_UNTIL_REBOOT标志和NULL目标一起使用。根据该文件,这样的:

注册lpExistingFileName文件系统重新启动时被删除。如果lpExistingFileName引用一个目录,则只有在目录为空时,系统才会在重新启动时删除该目录。

+1

我不明白为什么我们不能删除它,因为exe被加载到内存,所以为什么它需要与硬盘进行通信? – Xinus 2009-10-22 10:10:25

+10

Windows只会根据需要加载尽可能多的可执行文件,因此它不会(a)耗尽太多RAM或(b)如果没有足够的RAM,则必须将可执行文件再次写入交换文件。您可以将每个由Windows运行的可执行文件视为临时只读交换文件。如果需要丢弃一页RAM,Windows可以简单地将其丢弃,因为知道它可以在必要时始终从EXE文件重新加载。 – 2009-10-22 10:16:45

+0

这种方法太依赖于重启。毫无疑问,它会工作,但我想尽快删除文件。 – ata 2009-10-26 05:51:55

0

直到该exe文件在内存中,它将无法自行删除。但是,它可以在系统预计完成其执行后的一段时间间隔之后向系统注册一个删除任务。

4

在Linux上可以这样做。您会发现,通常不可能在Windows上删除正在运行的可执行文件。但是,您可以让Windows在下次重新启动时为您删除EXE:http://www.howtodothings.com/computers/a1402-delete-a-running-exe.html

如果您希望文件在运行后被删除,您可以直接要求用户删除它。如果你想要这样做的原因是作为安全措施,那么你在做什么是错误的。用户可以通过首先制作一个文件副本来绕过这个问题。

+0

当然,这个功能(以及诸如隐藏/系统文件之类的东西)也可以在用户错误地使用相当于'rm -rf /'时节省大量用户数据(以及系统本身)。这对我来说有点不安,unix系统不会沾染睫毛,只是摆脱*一切*。如果你认为你必须真的很愚蠢,那么只需看看你可以谷歌“XXX已删除所有数据”的* nix shell脚本/应用程序的数量。包括像Steam这样的高级软件:D在路径之前指定'-rf'并不能帮助--' /'/'\'非常接近'enter'。 – Luaan 2015-03-31 08:09:19

13
process.start("cmd /c ping localhost -n 3 > nul & del filepath") 
exit 

与替代的Process.Start任何命令你的编程语言使用以参数启动程序

替换路径文件路径到你的EXE

与命令替换退出终止程序

+0

如果你没有使用XP,你可以通过传递“”/ C选择/ CY/N/DY/T 3“来避免ping解决方法(cmd-command本身将等待3秒):https:// www。 codeproject.com/Articles/31454/How-To-Make-Your-Application-Delete-Itself-Immedia – maja 2018-03-02 11:18:03

0

我通过创建在进程仍在运行时执行的批处理文件解决了此问题(使用Visual Basic),等待1秒,以便程序可以关闭自身并删除程序。

您可能需要修改它才能删除同一文件夹中的所有东西。在你的任务刚刚致电del(),它应该工作。

Sub del() 
    Dim file As System.IO.StreamWriter 
    file = My.Computer.FileSystem.OpenTextFileWriter("del.bat", True) 
    file.WriteLine("") 
    file.WriteLine("timeout 1") 
    file.WriteLine("echo Y | del *.*") 
    file.Close() 
    Process.Start("del.bat") 
    Me.Close() 
End Sub 
相关问题