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

.net 使用Path.GetTempFileName创建的文件是否会自动清理?,.net,temporary-files,.net,Temporary Files,我一直认为答案是肯定的,但现在我正在努力寻找真相 当我使用Path.GetTempFileName()创建临时文件时,windows会在以后自动清理该文件吗 如果我在Path.GetTempPath()下创建一个目录,会怎么样?windows会清理它吗 或者删除在那里创建的文件是开发人员的责任吗?否。不会。这就是为什么特别声明 “如果没有唯一的,GetTempFileName方法将引发IOException 临时文件名可用。若要解决此错误,请删除所有 不需要的临时文件。” 不,它们不会自动删除。

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

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

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


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

否。不会。这就是为什么特别声明

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


不,它们不会自动删除。要创建一个在关闭时自动删除的文件,请将
file\u FLAG\u DELETE\u ON\u CLOSE
传递给

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


为了从.net访问此Win32功能,请使用该类。

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

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

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

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

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

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

在Windows 8上作为控制台应用程序运行时,我会在本地PRPOP文件中找到一个路径:

C:\Users\sweaver\AppData\Local\Temp\2\tmp4193.tmp
在IIS中,对于我获得的AppPool,加载用户配置文件=True:

C:\Users\APPPOOL\u NAME\AppData\Local\Temp

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

C:\Windows\TEMP\tmp7C32.tmp

你想立刻清理你的临时文件来避免这种情况

FILE\u ATTRIBUTE\u TEMPORARY
也不会自动删除文件。该标志仅仅提示操作系统尽量将文件缓存在内存中,并可能放弃物理介质。你想要的标志是
FILE\u flag\u DELETE\u ON\u CLOSE
@JesseC.Slicer你说得对,我的大脑冻结了。我现在改正了。谢谢。没问题,先生+1获取信息。无需为此使用P/Invoke,请使用接收并传入
文件选项的。DeleteOnClose
。如果创建tmp文件并立即将其删除,请小心。有时病毒防护软件会跳入并尝试扫描它,然后阻止您删除它。从Windows 10和Storage Sense开始,它们可能会被系统删除:相关: