C#程序自删除
核心实现方法就是调用 cmd 传入命令行,等待几秒之后删除文件;
应用程序在运行时,是不能将 exe 文件进行删除的。但是可以将 exe 改名以及在驱动器内进行移动文件;
删除应用程序可以让 cmd 进行删除,在 cmd 可以使用 timeout 命令延迟,然后通过 && 进行执行后续逻辑,从而实现延迟执行命令。
让 cmd 延迟执行 DEL 命令进行删除应用,在应用调用删除之后,让应用程序结束即可
代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
static void Main( string [] args) { var fileName = Process.GetCurrentProcess().MainModule.FileName; DelayDeleteFile(fileName, 2); //这里是关闭程序后2秒删除程序 } private static void DelayDeleteFile( string fileName, int delaySecond = 2) { fileName = Path.GetFullPath(fileName); var folder = Path.GetDirectoryName(fileName); var currentProcessFileName = Path.GetFileName(fileName); var arguments = $ "/c timeout /t {delaySecond} && DEL /f {currentProcessFileName} " ; var processStartInfo = new ProcessStartInfo() { Verb = "runas" , // 如果程序是管理员权限,那么运行 cmd 也是管理员权限 FileName = "cmd" , UseShellExecute = false , CreateNoWindow = true , // 如果需要隐藏窗口,设置为 true 就不显示窗口 Arguments = arguments, WorkingDirectory = folder, }; Process.Start(processStartInfo); } |
Winform使用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault( false ); Application.Run( new Form1()); var fileName = Process.GetCurrentProcess().MainModule.FileName; DelayDeleteFile(fileName, 2); } private static void DelayDeleteFile( string fileName, int delaySecond = 2) { fileName = Path.GetFullPath(fileName); var folder = Path.GetDirectoryName(fileName); var currentProcessFileName = Path.GetFileName(fileName); var arguments = $ "/c timeout /t {delaySecond} && DEL /f {currentProcessFileName} " ; var processStartInfo = new ProcessStartInfo() { Verb = "runas" , // 如果程序是管理员权限,那么运行 cmd 也是管理员权限 FileName = "cmd" , UseShellExecute = false , CreateNoWindow = true , // 如果需要隐藏窗口,设置为 true 就不显示窗口 Arguments = arguments, WorkingDirectory = folder, }; Process.Start(processStartInfo); } |
WPF使用示例
首先在app.xaml中添加ShutdownMode=“OnExplicitShutdown”,删除StartupUri=“MainWindow.xaml”
然后在app.xaml.cs中添加如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
protected override void OnStartup(StartupEventArgs e) { base .OnStartup(e); new MainWindow().ShowDialog(); var fileName = Process.GetCurrentProcess().MainModule.FileName; DelayDeleteFile(fileName, 2); Application.Current.Shutdown(); } private static void DelayDeleteFile( string fileName, int delaySecond = 2) { fileName = Path.GetFullPath(fileName); var folder = Path.GetDirectoryName(fileName); var currentProcessFileName = Path.GetFileName(fileName); var arguments = $ "/c timeout /t {delaySecond} && DEL /f {currentProcessFileName} " ; var processStartInfo = new ProcessStartInfo() { Verb = "runas" , // 如果程序是管理员权限,那么运行 cmd 也是管理员权限 FileName = "cmd" , UseShellExecute = false , CreateNoWindow = true , // 如果需要隐藏窗口,设置为 true 就不显示窗口 Arguments = arguments, WorkingDirectory = folder, }; Process.Start(processStartInfo); } |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_43024228/article/details/122404162