用C#创建一个可以自毁的程序

Design

图1:设计窗体

添加必要的命名空间,以便能够进行文件操作。

1using System;
2using System.Diagnostics;
3using System.IO;
4using System.Windows.Forms;

创建一个名为SelfDestruct的子过程。

 1private void SelfDestruct()
 2      Process procDestruct = new Process();
 3      string strName = "destruct.bat";
 4      string strPath = Path.Combine(Directory
 5         .GetCurrentDirectory(), strName);
 6      string strExe = new FileInfo(Application.ExecutablePath)
 7         .Name;
 8      StreamWriter swDestruct = new StreamWriter(strPath);
 9 
10      swDestruct.WriteLine("attrib \"" + strExe + "\"" +
11         " -a -s -r -h");
12      swDestruct.WriteLine(":Repeat");
13      swDestruct.WriteLine("del " + "\"" + strExe + "\"");
14      swDestruct.WriteLine("if exist \"" + strExe + "\"" +
15         " goto Repeat");
16      swDestruct.WriteLine("del \"" + strName + "\"");
17      swDestruct.Close();
18 
19      procDestruct.StartInfo.FileName = "destruct.bat";
20 
21      procDestruct.StartInfo.CreateNoWindow = true;
22      procDestruct.StartInfo.UseShellExecute = false;
23 
24      try
25      {
26 
27         procDestruct.Start();
28 
29      }
30      catch (Exception)
31      {
32 
33         Close();
34 
35      }
36   }

SelfDestruct子过程创建一个名为destruct.bat的批处理文件。批处理文件是包含要依次执行的指令列表的计算机文件。您创建的批处理文件将删除正在运行的可执行文件。

    <p class="ordinary-output target-output clearfix">
      <span class="">在Button1后面添加下面的代码。</span>
    </p>
  </div>
</div>
1private void button1_Click(object sender, EventArgs e)
2   {
3 
4      SelfDestruct();
5      Close();
6 
7   }

第一个按钮简单地调用SelfDestruct子过程,然后调用关闭方法关闭窗体。

    <p class="ordinary-output target-output clearfix">
      <span class="">将下面的代码添加到您的Button2中。</span>
    </p>
  </div>
</div>
1Process.Start("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del "
2         + Application.ExecutablePath);
3      Application.Exit();

这段代码生成命令提示符,并执行删除当前运行的EXE文件的命令,然后退出应用程序。这是可行的,但唯一的问题是它显示命令提示符窗口,同时删除文件。为了避免这种情况,请编辑前面的代码,如下所示。

 1private void button2_Click(object sender, EventArgs e)
 2   {
 3 
 4      ProcessStartInfo piDestruct = new ProcessStartInfo();
 5      piDestruct.Arguments = "/C choice /C Y /N /D Y /T 3 & Del "
 6         + Application.ExecutablePath;
 7 
 8      piDestruct.WindowStyle = ProcessWindowStyle.Hidden;
 9      piDestruct.CreateNoWindow = true;
10 
11      piDestruct.FileName = "cmd.exe";
12 
13      Process.Start(piDestruct);
14 
15   }

在这里,您创建一个ProcessStartInfo 对象,并提供有关执行什么以及窗口样式的参数。

图2显示了程序运行时仍然存在的EXE。图3在删除后没有显示EXE。

Running

图2:运行

Deleted 图3:删除

结论

虽然在卸载和重新安装应用程序时,这个方法是非常有用。但有一个问题,Windows被设计为不删除正在运行的文件,绕过这个特性可能有提示。