使用Path.GetTempFileName创建的文件是否会自动清除?

时间:2012-02-08 21:02:14

标签: .net temporary-files

我一直认为答案是肯定的,但现在我想找到真相。

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

如果我在Path.GetTempPath()下创建目录怎么办?窗户会清理它吗?

或者开发人员有责任删除在那里创建的文件吗?

5 个答案:

答案 0 :(得分:10)

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

  

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

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

答案 1 :(得分:4)

没有。它不会。这就是为什么http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx明确指出“如果没有唯一的临时文件名可用,GetTempFileName方法将引发IOException。要解决此错误,请删除所有不需要的临时文件。”

答案 2 :(得分: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;
}

答案 3 :(得分:2)

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

用于临时文件的路径名取决于上下文。因此,如果您收到此错误且处于紧急状态,则需要确保可以快速找到正确的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

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

答案 4 :(得分:1)

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

//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
};