程序快速删除自己
1、介绍
最近在做一个系统,要求在安装程序在完成安装之后删除自身。遇到这样的问题,当然要祭起”Google大法”。果不其然,与我想同问题的朋友还是不少。网上给出的方案里面大致有这么几种。
2、方法
(1)利用批处理文件,删除自身
using System.Runtime.InteropServices;
//****************************************添加引用
[DllImport("kernel32.dll")]
public static extern uint WinExec(string lpCmdLine, uint uCmdShow);
private void button1_Click(object sender, EventArgs e)
{
string vBatFile = Path.GetDirectoryName(Application.ExecutablePath) + "\\Zswang.bat";
using (StreamWriter vStreamWriter =new StreamWriter(vBatFile, false, Encoding.Default))
{
vStreamWriter.Write(string.Format(
":del\r\n" +
" del \"{0}\"\r\n" +
"if exist \"{0}\" goto del\r\n" + //此处已修改
"del %0\r\n", Application.ExecutablePath));
}
//************ 执行批处理
WinExec(vBatFile, 0);
//************ 结束退出
Close();
}
(2)利用压栈和出栈方式(汇编方法)
#include <windows.h>
int main( int argc, char *argv[] )
{
HMODULE module = GetModuleHandle(0);
CHAR buf[MAX_PATH];
GetModuleFileName(module, buf, sizeof buf);
CloseHandle(HANDLE(4));
__asm
{
lea eax, buf;
push 0;
push 0;
push eax;
push ExitProcess;
push module;
push DeleteFile;
push UnmapViewOfFile;
ret;
}
return 0;
}
(3)DELETE_ON_CLOSE方法
先复制(CLONE)一个自己,用复制品起动另一个进程,然后自己结束运行,则原来的EXE文件不被系统保护.这时由新进程作为杀手删除原来的EXE文件,并且继续完成程序其他的功能。利用FILE_FLAG_DELETE_ON_CLOSE标志告诉操作系统,当和这个文件相关的所有句柄都被关闭之后(包括上面这个CREATEFILE创建的句炳),就把这个文件删除。
代码见
http://amxiaomao.blog.bokee.net/bloggermodule/blog_viewblog.do?id=165370
(4)利用cmd命令
这种方法,在网上并不多见。因此,本文重点介绍这种方法。这是在外国网站上偶尔看到的方法。原文提供了两种不同的命令语句格式。
代码非常简单。
在button1的click事件处理程序添加如下代码:
Process.Start("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del " + Application.ExecutablePath);
Application.Exit();
下面解释下命令的意思:
Cmd /c 调用命令窗口执行dos指令
Choice /C Y /N /D Y /T 3 这个命令有点怪,等待3分钟之后执行一个默认为y的选择命令
& 连接下一个命令(用于一行执行多个命令)
可惜这种方法由于xp不支持Choice命令,没有测试成功。
基于这种思路,该文章还提出一种命令格式
Process.Start("cmd.exe", "/C ping
Application.ExecutablePath);
Application.Exit();
利用 ping命令的 –w 参数指定延时执行。经测试成功删除自身。
3、总结
方式2、3,我没有测试,但是根据文章内容来看要想在c#中实相对来说比较困难一些。(4)方式,利用某些dos命令的延时效果,在程序退出之后自动删除程序自身思路非常巧妙。也避免了bat方式,循环删除的问题。当然4方法从本质上应该和1方法差不多,但是书写来简洁的多了,:)。
个人网站:生活百科
本文版权所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?