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

29

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

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

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

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


从 Windows 10 和存储感应器开始,它们可能会被系统删除:https://dev59.com/33E95IYBdhLWcg3wkegf#63848110 - Ohad Schneider
相关链接:https://dev59.com/tXRC5IYBdhLWcg3wW_pk - Ohad Schneider
5个回答

14

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

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

为了从.NET访问这个Win32功能,请使用SafeFileHandle类。


2
FILE_ATTRIBUTE_TEMPORARY 不会自动删除文件。该标志仅提示操作系统尽可能将文件缓存在内存中,并可能放弃物理介质。您需要的标志是 FILE_FLAG_DELETE_ON_CLOSE - Jesse C. Slicer
@JesseC.Slicer 你说得对,是我脑子短路了。我已经纠正了。谢谢。 - David Heffernan
没问题,先生!谢谢提供信息。 - Jesse C. Slicer
不需要使用P/Invoke,可以使用带有FileOptions参数的FileStream构造函数(https://msdn.microsoft.com/en-us/library/ms143396(v=vs.110).aspx),并传入FileOptions.DeleteOnClose。 - Scott Chamberlain

6

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

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

6

3
回答这个问题是不可以的,直到您到达tmpFFFF.tmp并收到错误提示,您才会注意到。如果这是在Web服务器上运行,则操作将失败。
用于临时文件的路径名取决于上下文。因此,如果您遇到此错误并且这是紧急情况,您需要确保可以快速找到正确的tmp文件夹。
在Windows 8上作为控制台应用程序运行会在本地配置文件中给出一个路径:
C:\Users\sweaver\AppData\Local\Temp\2\tmp4193.tmp

如果在IIS的应用程序池中启用了 Load User Profile = True,则会得到以下路径:

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

而如果将 Load User Profile = False,则会得到更易于管理的路径:

C:\Windows\TEMP\tmp7C32.tmp

您需要立即清理临时文件以避免这种情况发生!


注意,如果您创建了一个临时文件并立即删除它,请小心。有时候病毒防护软件会介入并尝试扫描它,然后阻止您删除它。 - Simon_Weaver

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接