【问题标题】:Deleting temp files automatically (C#)自动删除临时文件 (C#)
【发布时间】:2015-04-20 09:49:26
【问题描述】:

我有一个场景,我将文件从存储下载到临时文件夹。然后我调用一个框架来处理文件,这个框架在应用程序的生命周期内需要这个文件。当应用程序退出时,我关闭所有文件,但当应用程序崩溃时,文件不会被删除。应用程序可以有多个实例。

删除这些文件的最佳方法是什么?我有两个想法:

  1. 可以在下次运行应用程序时删除文件。我的想法是在临时路径中使用一个主文件夹,并在其中文件夹名称等于当前进程的进程 ID 的文件夹中使用一个文件夹。当我下次运行应用程序时,我会检查所有文件夹,并检查是否有运行此 ID 的进程。如果没有,我删除该文件夹。这个解决方案的问题是,它需要管理员权限才能运行 Process.GetProcessById
  2. 我为每个进程创建一个文件夹并使用锁定文件。我保持用 DeleteOnClose 等于 true 打开的流。在应用程序的下一次运行中,我检查所有文件夹及其锁定文件。如果没有锁定文件或者我可以删除它,我也会删除该文件夹。

您还有其他想法吗?


编辑:实施的解决方案 #2,就像一个魅力。

【问题讨论】:

    标签: c# temp


    【解决方案1】:

    没有自动删除临时文件的内置方法。但是您可以在重新启动时通过简单调用 WinAPI 函数 MoveFileEx 指定标志值 MOVEFILE_DELAY_UNTIL_REBOOT 来实现 - 您的临时文件将在您下次启动时消失(如果它仍然存在)。以下是从 C# 执行此操作的两个示例:12

    调用此函数的效果是在注册表中的HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations 键中添加一个条目(您可以直接输入该值,但这是执行此操作的首选方法)。如果您在使用临时文件之前执行此操作,请在完成后删除临时文件。如果您的进程崩溃,则所有已使用的文件都将在注册表中拥有一个条目,如果文件在下次重新启动时已经消失,那么什么也不会发生(即没有引发错误或任何事情)。

    【讨论】: