如何在无进程引用时删除C# WinForms生成的‘占用中’临时文件?
问题背景
我开发的C# WinForms应用会生成包含敏感信息(如银行对账单)的临时文件,通过系统默认关联的查看器打开。我的核心需求是用户查看完毕后,这些文件能自动被删除。目前我通过注册Application.ApplicationExit事件来触发文件删除,这个方案能覆盖大多数场景,但存在明显局限:当用户退出主应用时,如果查看器还没关闭,File.Delete能否成功完全取决于查看器是否以FileShare.Delete打开了文件——这一点完全不受我的控制。
已尝试的无效方案
我试过几种方法,但都没法满足需求:
FileOptions.DeleteOnClose:一方面,主应用关闭后我可能还需要保留文件;另一方面,用这个选项创建的文件,Adobe Reader、记事本这类常用查看器会直接提示“文件正被另一进程占用”,用户根本没法正常查看。MoveFileEx+MOVEFILE_DELAY_UNTIL_REBOOT:这个方法要等系统重启才能删除文件,对用户太不友好了,而且现在用户重启系统的频率很低,敏感文件长时间留存的风险太高。- 后台进程持续尝试删除:这种方式会增加应用的部署复杂度,还会占用客户端的系统资源,我希望能避免这种方案。
额外疑问
我还想确认两个点:
- Windows会在重启时自动清理
%temp%文件夹吗? - 有没有系统自带的、重启时会自动清理的临时文件夹?
核心诉求
有没有Win32 API或者.NET Framework API,可以实现当没有任何进程持有该文件的打开句柄时,立即删除文件?
最终最佳方案(经实验与参考验证)
经过测试和参考相关方案,我最终确定的最佳方案是:如果查看器不允许FileShare.Delete,则强制用户关闭查看器后再退出主应用。决策依据如下:
FileOptions.DeleteOnClose仅在所有进程都以FileShare.Open打开文件时才会生效,但多数常用查看器并不遵循这个规则,实际使用中基本行不通;- 敏感文件绝对不能长时间留存,重启删除只能作为极端情况下的兜底方案,不能作为常规手段依赖;
- 维护一个后台进程的开发、测试、部署成本,远远超过让用户多一步关闭查看器的轻微不便,性价比太低。
内容的提问来源于stack exchange,提问作者Vikhram
相关产品推荐
相关产品推荐

