65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (72投票s)

2008年12月3日

CPOL

4分钟阅读

viewsIcon

267423

一个简单的两行技巧,几乎可以用于任何应用程序。

引言

我敢肯定,你一定也曾经对自己或办公室里的某个人说过:“<哼> 你这个白痴。你不知道 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** 命令就发挥作用了,并在命令窗口自行关闭之前将其删除!

以下是对这些参数含义的描述。  

  1. Cmd /C 会打开一个命令窗口并运行指定的命令。然后它会自动关闭该窗口。
  2. Choice /C Y /N /D Y /T 3 显示一个空白的、闪烁的提示符。但是,**/T 3** 意味着在 3 秒后,提示符会自动选择默认选项 **Y**(**/D Y**)。在我写这篇文章前几分钟才知道“choice”命令。
  3. & 用于在批处理文件的单行上链接多个命令。我直到现在才知道 **&**。 
  4. 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 的版本,并实现了读者的一些评论。 
© . All rights reserved.