我一直认为答案是肯定的,但现在我想找到真相。
当我使用Path.GetTempFileName()
创建临时文件时,Windows会在以后自动清理吗?
如果我在Path.GetTempPath()
下创建目录怎么办?窗户会清理它吗?
或者开发人员有责任删除在那里创建的文件吗?
答案 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
};