我一直以为答案是肯定的,但现在我正在努力寻找真相。
当我使用Path.GetTempFileName()
创建临时文件时,Windows会自动清理它吗?
如果我在Path.GetTempPath()
下创建一个目录会怎样?Windows会清理它吗?
还是开发者有责任删除在那里创建的文件?
我一直以为答案是肯定的,但现在我正在努力寻找真相。
当我使用Path.GetTempFileName()
创建临时文件时,Windows会自动清理它吗?
如果我在Path.GetTempPath()
下创建一个目录会怎样?Windows会清理它吗?
还是开发者有责任删除在那里创建的文件?
不,它们不会自动被删除。为了创建一个在关闭时会自动被删除的文件,请在CreateFile
中传递FILE_FLAG_DELETE_ON_CLOSE
。
所有句柄都被关闭后(包括指定的句柄和任何其他打开或重复的句柄),该文件将立即被删除。 如果有现有的打开的句柄,则调用会失败,除非它们都是使用 FILE_SHARE_DELETE 共享模式打开的。 文件的后续打开请求将失败,除非指定了 FILE_SHARE_DELETE 共享模式。
为了从.NET访问这个Win32功能,请使用SafeFileHandle
类。
FILE_ATTRIBUTE_TEMPORARY
不会自动删除文件。该标志仅提示操作系统尽可能将文件缓存在内存中,并可能放弃物理介质。您需要的标志是 FILE_FLAG_DELETE_ON_CLOSE
。 - Jesse C. Slicer对于我的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;
}
tmpFFFF.tmp
并收到错误提示,您才会注意到。如果这是在Web服务器上运行,则操作将失败。tmp
文件夹。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
您需要立即清理临时文件以避免这种情况发生!
这种方法对我很有效。跟踪打开程序关闭的时间,然后尝试删除文件。
//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
};