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



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

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

如果我在Path.GetTempPath()下创建一个目录,该怎么办?窗户会把它清理干净吗?

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

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

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

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

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

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

否。不会的。这就是为什么http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx具体说明

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

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

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

在Windows8上作为控制台应用程序运行,可以在本地prpofile中找到一条路径:

C:UserssweaverAppDataLocalTemp2tmp4193.tmp

在应用程序池使用Load User Profile = True的IIS中,我得到:

C:UsersAPPPOOL_NAMEAppDataLocalTemp

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

C:WindowsTEMPtmp7C32.tmp

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

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

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

最新更新