【问题标题】:Do files created with Path.GetTempFileName get cleaned up automatically?使用 Path.GetTempFileName 创建的文件会自动清理吗?
【发布时间】:2012-03-01 08:42:24
【问题描述】:

我一直认为答案是肯定的,但现在我正在努力寻找真相。

当我使用Path.GetTempFileName() 创建一个临时文件时,Windows 稍后会自动清理它吗?

如果我在Path.GetTempPath() 下创建一个目录呢? windows会清理它吗?

还是开发者有责任删除那里创建的文件?

【问题讨论】:

标签: .net temporary-files


【解决方案1】:

没有。它不会。这就是为什么http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx 特别声明

"如果没有唯一的,GetTempFileName 方法将引发 IOException 临时文件名可用。要解决此错误,请删除所有 不需要的临时文件。”

【讨论】:

    【解决方案2】:

    问题的答案是否定的,您可能永远不会注意到,直到您到达tmpFFFF.tmp 并收到错误消息。如果这是在网络服务器上,您的操作将失败。

    用于临时文件的路径名取决于上下文。因此,如果您遇到此错误并且这是紧急情况,您需要确保可以快速找到正确的 tmp 文件夹。

    在 Windows 8 上作为控制台应用程序运行为我提供了本地 prpofile 中的路径:

    C:\Users\sweaver\AppData\Local\Temp\2\tmp4193.tmp
    

    在带有Load User Profile = True 的 IIS 中,我得到了 AppPool:

    C:\Users\APPPOOL_NAME\AppData\Local\Temp

    Load User Profile = False 我得到一个更易于管理的:

    C:\Windows\TEMP\tmp7C32.tmp
    

    您想立即清理临时文件以避免这种情况!

    【讨论】:

    • 当心如果你创建了一个 tmp 文件并立即删除它。有时病毒防护软件会跳进来尝试扫描它,然后阻止你删除它。
    【解决方案3】:

    这种方法对我很有效。跟踪打开的程序何时关闭,然后尝试删除文件。

    //Open it now and cleanup when program closes
    Process p = Process.Start(path);
    p.EnableRaisingEvents = true;
    p.Exited += (sender, e) =>
    {
        try
        {
            File.Delete(path);
        }
        catch { } //Suppress errors
    };
    

    【讨论】:

      【解决方案4】:

      对于我的 Windows 窗体和 WPF 应用程序,我添加了一个事件以在应用程序关闭时删除文件。像这样:

      private string GetTempFile() {
          string tmpfile = Path.GetTempFileName();
          this.Closed += (object sender, EventArgs e) => {
              if (File.Exists(tmpfile))
                  File.Delete(tmpfile);
          };
          return tmpfile;
      }
      

      【讨论】:

        【解决方案5】:

        不,它们不会被自动删除。为了创建一个在关闭时会自动删除的文件,请将FILE_FLAG_DELETE_ON_CLOSE 传递给CreateFile

        文件将在其所有句柄关闭后立即删除,包括指定的句柄和任何其他打开或重复的句柄。 如果文件存在现有的打开句柄,则调用将失败,除非它们都以 FILE_SHARE_DELETE 共享模式打开。 除非指定了 FILE_SHARE_DELETE 共享模式,否则对文件的后续打开请求将失败。

        要从 .net 访问此 Win32 功能,请使用 SafeFileHandle 类。

        【讨论】:

        • FILE_ATTRIBUTE_TEMPORARY 也不会自动删除文件。该标志仅提示操作系统尝试尽可能多地将文件缓存在内存中,并可能放弃物理介质。你想要的标志是FILE_FLAG_DELETE_ON_CLOSE
        • @JesseC.Slicer 你是对的,我的大脑冻结了。我现在已经更正了。谢谢。
        • 没问题,先生!为信息 +1。
        • 不需要为此使用 P/Invoke,使用 FileStream constructor 接收 FileOptions 并传入 FileOptions.DeleteOnClose
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 2018-05-17
        • 1970-01-01
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多