运行进程有没有办法删除自己的可执行文件?
例如,我创建一个控制台应用程序(单个exe),在完成某些任务后,它会以某种方式删除exe文件。
我必须向某人发送一个文件。我希望它在完成预定任务后删除。
无论如何都要在Windows中执行此操作
答案 0 :(得分:19)
执行此操作的一种方法是将MoveFileEx函数与MOVEFILE_DELAY_UNTIL_REBOOT
标记和NULL
目标一起使用。根据文档,这个:
注册系统重新启动时要删除的 lpExistingFileName 文件。如果 lpExistingFileName 引用目录,则仅当目录为空时,系统才会在重新启动时删除目录。
答案 1 :(得分:16)
process.start("cmd /c ping localhost -n 3 > nul & del filepath")
exit
将process.start替换为编程语言用于启动带参数的程序的任何命令
将filepath替换为exe
的路径将exit替换为终止程序的命令
答案 2 :(得分:4)
可以在Linux上执行此操作。您会发现通常无法在Windows上删除正在运行的可执行文件。但是,您可以让Windows在下次重新启动时为您删除EXE:http://www.howtodothings.com/computers/a1402-delete-a-running-exe.html
如果您希望文件在运行后被删除,您只需要求用户将其删除即可。如果你想要这个的原因是一个安全措施,那么你所做的就是误入歧途。用户可以通过首先制作文件的副本来避免这种情况。
答案 3 :(得分:3)
您可以使用Windows计划程序安排任务在X秒后删除您的程序。
命令行:http://msdn.microsoft.com/en-us/library/bb736357%28VS.85%29.aspx
或API:http://msdn.microsoft.com/en-us/library/aa383608%28VS.85%29.aspx
答案 4 :(得分:2)
您可以运行另一个应用程序,它将等待父进程终止,然后删除其可执行文件。
答案 5 :(得分:0)
直到exe在内存中,它将无法删除自己。但是,它可以向系统注册一个任务,用于在预期完成执行的设定时间段之后删除自身。
答案 6 :(得分: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
答案 7 :(得分:0)
虽然在运行时无法自行删除文件,但可以从文件启动分离的cmd命令,然后在命令执行之前结束文件操作。
因此,如果要删除bat文件,可以在文件末尾添加以下行:
start cmd /c del %0
文件会自毁。
start cmd
将启动一个新的cmd窗口(与您的主进程分离)。
/c
告诉窗口执行行/c
之后的所有操作。
然后del
将在给定的路径下删除文件。
参数$0
引用第一个命令行参数,通常是我们想要的文件的名称和路径。
($0
参数是文件的路径,您要将其传递给del命令)。
答案 8 :(得分:0)
我在其他任何地方都找不到任何解决方案,所以我会在这里发布我的解决方案。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
char* process_name = argv[0];
char command[256] = "start /min cmd /c del ";
strcat(command, process_name);
printf("Attempting to delete self...\n");
system(command);
return 0;
}
通常,尝试使用 system
调用命令提示符来删除可执行文件是行不通的,因为生成的命令提示符是 system
执行并等待返回状态的子进程。
此方法调用系统在其自己的线程上启动命令提示符进程。
/min
参数以“隐藏”方式启动进程。
/c
参数为生成的命令提示符提供参数。
我知道这是一个旧线程,但我希望那些将来会来到这里。