用C#创建一个可以自毁的程序
图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。
图2:运行
图3:删除结论
虽然在卸载和重新安装应用程序时,这个方法是非常有用。但有一个问题,Windows被设计为不删除正在运行的文件,绕过这个特性可能有提示。