如何让您的应用程序立即删除自身






4.29/5 (72投票s)
一个简单的两行技巧,几乎可以用于任何应用程序。
引言
我敢肯定,你一定也曾经对自己或办公室里的某个人说过:“<哼> 你这个白痴。你不知道 Windows 应用程序不能自我删除吗?我敢打赌你甚至不知道如何使用 ALT 键和数字键盘输入高 ASCII 字符,真是的……”
当然,有一些方法可以让一个文件在下次重启时自我删除……你甚至可以求助于外部程序或批处理文件来完成这项工作。但我刚刚想出了一个巧妙的方法,可以在不留下应用程序曾经存在过的可见痕迹的情况下做到这一点!
背景
这只是一个简单的、随机的想法突然出现在我的脑海里。从构思到编写一个快速、可运行的演示应用程序,只花了大约 5 分钟,而且这种技术几乎适用于任何基于 Windows 的开发平台/语言。
事实上,在 CodeProject 上发布这篇文章花费的时间比这个还要长!但既然我从未在 CodeProject 上发布过任何内容,我认为这将是一个有趣、简单的练习。:)
Using the Code
请注意,我不可能为所有支持的语言/框架/平台发布这项技术有效的代码。正如你很快就会看到的,只需要两行代码就可以让程序在不留下痕迹的情况下删除自身。这两行代码在你选择的开发环境中可能会略有不同,但翻译成适合你的代码应该只需要一两分钟。
这是那两行代码(正如读者指出的,这个版本在 XP 上不起作用)。
Process.Start("cmd.exe",
"/C choice /C Y /N /D Y /T 3 & Del " + Application.ExecutablePath);
Application.Exit();
Process.Start(...)
是一个 .NET 命令,用于启动一个带有参数的应用程序。第一个参数是要启动的应用程序。第二个参数是一个包含要传递给启动应用程序的参数的 string
。默认情况下,此命令不会暂停并等待启动的应用程序完成,而是继续执行下一条命令。下一条命令恰好是 Application.Exit()
。 在 .NET 中,这将导致当前运行的应用程序完全关闭。与此同时,我们的命令窗口已经弹出,并只是等待 3 秒钟让调用应用程序完全关闭。一旦发生这种情况,**Del** 命令就发挥作用了,并在命令窗口自行关闭之前将其删除!
以下是对这些参数含义的描述。
- Cmd /C 会打开一个命令窗口并运行指定的命令。然后它会自动关闭该窗口。
- Choice /C Y /N /D Y /T 3 显示一个空白的、闪烁的提示符。但是,**/T 3** 意味着在 3 秒后,提示符会自动选择默认选项 **Y**(**/D Y**)。在我写这篇文章前几分钟才知道“choice”命令。
- & 用于在批处理文件的单行上链接多个命令。我直到现在才知道 **&**。
- Del <Application.ExecutablePath>……嗯,我想你可以想象这是做什么的。**&** 之后的所有内容都可以替换为你希望在三秒延迟后发生的任何事情。你可以让命令删除目录中的每个文件……或者也许是一些更恶意的操作?:)
这是适用于 XP 的同一个东西的另一种变体
Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " +
Application.ExecutablePath);
Application.Exit();
这与前一个版本非常相似,只是它使用了 **ping** 命令来完成脏活。**-n 1** 告诉命令只 ping 一次,**-w 3000** 告诉命令在执行 ping 之前等待 3 秒钟。**> Nul**basically just hides the output of the ping command(基本上只是隐藏 ping 命令的输出)。
就是这样,各位!你可以将此代码放在应用程序中的任何位置,包括 WinForms 应用程序的 OnClosed
事件中。
关注点
许多人指出,如果出于某种原因,你的应用程序关闭时间超过了配置的超时时间,那么这个方法将不起作用。如果你需要一个更可靠的技术,可以考虑延长超时时间以及/或使用“重启时删除”注册表值。
此外,Filip Geens 还提供了隐藏命令提示符窗口的代码……
ProcessStartInfo Info=new ProcessStartInfo();
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+
Application.ExecutablePath;
Info.WindowStyle=ProcessWindowStyle.Hidden;
Info.CreateNoWindow=true;
Info.FileName="cmd.exe";
Process.Start(Info);
如果你觉得这段代码很有趣,或者你知道另一种具有相同优势的技术,请告诉我!另外,如果你将此代码移植到其他语言/平台,请在评论中发布你的版本,以便他人受益。
历史
- 2008 年 12 月 2 日晚上 10:29:11:第一个版本完成……耶!
- 2008 年 12 月 3 日上午 10:02:51:添加了一个适用于 XP 的版本,并实现了读者的一些评论。