程序如何删除自己的可执行文件

时间:2009-10-22 09:49:13

标签: windows file process

运行进程有没有办法删除自己的可执行文件?

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

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

无论如何都要在Windows中执行此操作

9 个答案:

答案 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 参数为生成的命令提示符提供参数。

我知道这是一个旧线程,但我希望那些将来会来到这里。