0

0

C#删除正在运行的EXE文件 C#如何实现程序自身的更新和删除

幻夢星雲

幻夢星雲

发布时间:2026-03-07 12:31:02

|

939人浏览过

|

来源于php中文网

原创

程序退出后无法直接删除自身exe,需通过外部载体(如批处理、powershell或启动器)延时执行删除或替换;自更新须下载新版本到临时位置,由启动器完成移动并以相同权限启动,全程需校验签名与哈希、记录日志防失败。

c#删除正在运行的exe文件 c#如何实现程序自身的更新和删除

程序退出后删除自身 EXE 文件

直接调用 File.Delete 会抛出 UnauthorizedAccessExceptionIOException,因为 Windows 锁住了正在运行的映像文件。必须让当前进程先退出,再由外部载体(如启动器、批处理、或另一个进程)完成删除。

  • 最稳妥做法:启动一个独立的批处理脚本,延迟几毫秒再执行 del,然后立即退出主程序
  • 批处理不能放在 EXE 同目录下直接双击运行——要由 C# 启动它,且需用 Process.Start("cmd.exe", "/c ...") 并设置 UseShellExecute = false 避免窗口闪现
  • 注意路径空格:命令中所有路径必须用英文双引号包裹,例如 "%~f0" 在批处理里安全,但 C# 拼接时得写成 """+exePath+"""
  • 不要用 Thread.Sleep(100) 等待文件释放——没用,锁是进程级的,不是 I/O 延迟问题

C# 自更新时替换正在运行的 EXE

不能边运行边覆盖自身文件,Windows 会拒绝写入。常见做法是把新版本下载到临时位置,用“启动器”接管后续流程:原程序退出 → 启动器把新 EXE 移到原位置 → 启动新 EXE。

  • 启动器可以是一个轻量级 .NET Core/.NET 6+ 控制台程序(避免依赖目标框架),也可以是无依赖的原生 exe(如用 C++ 写)
  • 关键点:原程序必须用 Environment.Exit(0) 退出,不能只是关闭窗体(WinForms/WPF 的 Application.Exit() 不等于进程终止)
  • 启动器执行移动操作前,建议先尝试 File.Move,失败则 fallback 到 File.Copy + File.DeleteMove 在同卷上是原子操作,更安全
  • 如果更新包是 zip,解压后务必校验 SHA256,否则被篡改的 EXE 替换进去就彻底不可逆了

用 PowerShell 脚本辅助删除或替换(绕过 cmd 限制)

PowerShell 比 cmd 更适合处理路径、权限和错误重试,尤其在企业环境组策略禁用 cmd 的情况下。

B2S商城系统
B2S商城系统

B2S商城系统B2S商城系统是由佳弗网络工作室凭借专业的技术、丰富的电子商务经验在第一时刻为最流行的分享式购物(或体验式购物)推出的开源程序。开发采用PHP+MYSQL数据库,独立编译模板、代码简洁、自由修改、安全高效、数据缓存等技术的应用,使其能在大浏览量的环境下快速稳定运行,切实节约网站成本,提升形象。注意:如果安装后页面打开出现找不到数据库等错误,请删除admin下的runtime文件夹和a

下载
  • 生成临时 ps1 文件时,内容开头加 Start-Sleep -Milliseconds 500,确保原进程已完全退出
  • Remove-Item -Path "...\app.exe" -Force -ErrorAction SilentlyContinue-Force 可绕过只读属性干扰
  • 调用时必须加 -ExecutionPolicy Bypass 参数,否则默认策略会阻止脚本运行:powershell.exe -ExecutionPolicy Bypass -File "cleanup.ps1"
  • PowerShell 脚本本身不能被主程序直接 File.Delete——它可能还在执行中,应让系统定时任务或另一层 wrapper 清理它

Update.exe 启动器如何知道该启动哪个新版本

启动器不负责下载,只负责“搬运+启动”,所以需要一种可靠方式传递目标路径。硬编码或配置文件都容易出错,推荐用启动参数传入。

  • 主程序退出前启动 Update.exe "C:\temp\new\app.exe",启动器解析 args[0] 得到新路径
  • 启动器执行 File.Move(args[0], currentExePath) 后,再调用 Process.Start(currentExePath)
  • currentExePath 必须用 Process.GetCurrentProcess().MainModule.FileName 获取,不能用 Application.ExecutablePath(WinForms 下可能含调试路径)
  • 如果新 EXE 和旧 EXE 签名不同,UAC 提权状态会丢失——启动器需以相同权限启动新进程,可检查 Process.GetCurrentProcess().Privileges 并用 Verb="runas" 显式提权

实际最难的不是删文件,是保证“删完不丢数据、启新不卡死、出错能回滚”。临时目录权限、杀毒软件拦截、NTFS 符号链接、甚至 OneDrive 同步状态,都可能让看似简单的 Move/Delete 失败。留一手日志,比加十层 try-catch 更有用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

97

2025.12.01

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

97

2025.12.01

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2023.12.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1431

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1162

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

833

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

461

2023.08.02

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.8万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号