删除临时文件时 C# 应用程序无异常退出

Posted

技术标签:

【中文标题】删除临时文件时 C# 应用程序无异常退出【英文标题】:C# app exits without exception when deleting a temp file 【发布时间】:2018-05-14 19:04:12 【问题描述】:

我在 C# 程序 (.Net 4.61) 中有一个类,它使用 Word 和 Amyuni PDF 套件来构建格式化的 PDF 文件。在此过程中,会在用户的 temp 文件夹中创建四个临时 PDF 文件:

private string TempFolder = Path.GetTempPath();

当该过程完成时,我会运行以下清理方法来删除该过程中生成的任何临时文件:

private void EraseTempFiles()

    // For each temp file:
    foreach (string tempFile in TempFiles)
    
        if (File.Exists(tempFile))
        
            File.Delete(tempFile);
        
    

这适用于几乎所有已部署的 Windows 系统(所有 64 位 Windows 7 系统),但在其中一些系统上,当 EraseTempFiles 方法删除第三个临时文件时,应用程序会立即退出。不会引发异常(我已将 File.Delete 包围在 try-catch 中以确定这一点)。

可以使用Windows资源管理器删除文件。

我已尝试将所有临时文件保存在不同的文件夹中并更改它们的命名方式,而行为没有改变。运行ProcDump 跟踪应用程序没有捕获任何东西,它只是报告:

[23:54:52] The process has exited.
[23:54:52] Dump count not reached.

我也订阅了未处理的异常事件:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);

private void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)

  System.Windows.Forms.MessageBox.Show(((Exception)e.ExceptionObject).Message);
  throw new NotImplementedException();

该处理程序也永远不会被调用。

我从未见过像这样没有解释的程序退出。似乎Windows本身可能由于某些违规行为而终止了该进程,但我不知道是什么,因为所有临时文件都基本相同,并且可以毫无问题地删除前两个。

以前有人见过这种行为吗?

【问题讨论】:

您查看过您的 Windows 事件日志吗? 听起来像是permissions 问题。将 Delete 包裹在 try catch 周围,看看它是否告诉你,或者它没有删除的原因 这是我的纯粹猜测,为什么你应该持保留态度。 Windows 试图在您删除时访问同一个文件,并且由于它的系统,它优先于您的代码,它首先操作它。并且您的状态在执行时无效,因此也不例外。我会在整个 foreach 循环中获取系统全局互斥锁。 msdn.microsoft.com/en-us/library/… 这不应该以任何方式减慢您的应用程序。 我怀疑 Word 或 Amyuni PDF 仍然持有这些文件的一些句柄。在删除文件之前,确保 Word 和 Amyuni PDF 对象已关闭和处置。从另一个应用程序自动化 Office 应用程序一直很脆弱。 MethodMan - 我尝试了我在帖子中提到的 try-catch。永远达不到目标。没有引发异常。 【参考方案1】:

禁用趋势科技后,删除临时文件时程序不再退出。重新启用趋势科技,果然,它被杀死了。现在需要确定如何让趋势科技运行,但不杀死我的应用程序!

【讨论】:

以上是关于删除临时文件时 C# 应用程序无异常退出的主要内容,如果未能解决你的问题,请参考以下文章

退出并加载我的应用程序时,如何将图像保存并读取到临时文件夹

退出 WinSCP 后保留临时文件

C# OutOfMemory、映射内存文件或临时数据库

如何在应用程序退出时正确删除“临时”NSManagedObject

临时文件夹中的文件会自动删除吗?

c# winform自动更新的一点问题