如何获取当前用户的临时文件夹

448

目前我正在使用以下函数来获取当前用户的临时文件夹路径:

string tempPath = System.IO.Path.GetTempPath();

在一些计算机上,它会给我当前用户的临时文件夹路径,例如:

C:\Documents and Settings\administrator\Local Settings\Temp\

在一些计算机上,它会给我系统临时文件夹路径,例如:

C:\Windows\TEMP

MSDN文档还指出上述API返回当前系统的临时文件夹。

是否有其他可用的API可以像这样给我当前用户的临时文件夹路径:

C:\Documents and Settings\administrator\Local Settings\Temp\


3
System.Environment.GetEnvironmentVariable("TEMP")的行为与GetTempPath()相同。 在我的计算机上,对于帐户'administrator',两个API都返回“C:\ WINDOWS \ TEMP”,但对于帐户'Network Service',两个API都返回“C:\ Documents and Settings \ Network Service \ Local Settings \ Temp \”。 - Anoop
1
也许“管理员”帐户确实有一个位于C:\Windows\Temp的临时文件夹? - Helen
2
你想要获取 C:\Documents and Settings\ 下的临时路径有特定的原因吗? - Noldorin
13
如果您需要系统临时文件夹而不是用户的(如果已设置),则可以使用 Environment.GetEnvironmentVariable("temp", EnvironmentVariableTarget.Machine)。请注意,本人将尽力使翻译内容通俗易懂,但不会更改原意,并且不会提供任何解释或其他额外内容。 - piers7
2
过去,我经常使用临时文件夹,并不关心它在哪里,只要清理可以发生,以免磁盘被完全消耗。临时文件夹的目的不是用于临时使用 - 垃圾占位符吗?为什么不能由API处理并保持未知状态?应该使用可配置的,众所周知的位置,而不是使用临时文件夹吗? - barrypicker
3个回答

463

System.IO.Path.GetTempPath()只是一个对Kernel32中GetTempPath(..)本地调用的包装器。

请参阅http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

从该页面复制:

GetTempPath函数按照以下顺序检查环境变量的存在,并使用找到的第一个路径:

  • TMP环境变量指定的路径。
  • TEMP环境变量指定的路径。
  • USERPROFILE环境变量指定的路径。
  • Windows目录。

我不太清楚“Windows目录”是否意味着Windows下的临时目录还是Windows目录本身。将临时文件转储到Windows目录本身听起来似乎不太理想,但谁知道呢。

因此,结合该页面和您的帖子,我猜测TMP、TEMP或USERPROFILE变量之一指向管理员用户的Windows路径,否则它们未设置并且采用Windows临时路径的后备方式。


19
“TEMP”环境变量会在两个位置设置:为用户本身和本地计算机。如果未为用户设置,则将使用本地计算机的环境变量,而默认安装中始终设置了该变量。因此,搜索通常在第二步停止。在测试中,如果“TMP”、“TEMP”和“USERPROFILE”都未设置,则实际上会回退到“%SystemRoot%”(即“C:\Windows\”)。 - Bob
1
在运行在“本地系统”下的Windows服务或由此类服务启动的应用程序中执行的代码中,C:\ Windows \ Temp文件夹有时被用作临时文件夹。 - NineBerry
1
你提供的链接中的文档说明如下:“返回的字符串以反斜杠结尾,例如,”C:\ TEMP“。但是他们的示例实际上并没有以反斜杠结尾。” - dcp
您不能保证在应用程序中具有写入路径的权限,该函数返回的路径。如果尝试使用IsolatedStorage呢? - John

56

请勿使用此代码:

System.Environment.GetEnvironmentVariable("TEMP")

环境变量可以被覆盖,因此 TEMP 变量不一定是指该目录。

正确的方法是使用已接受答案中提到的 System.IO.Path.GetTempPath()


38
因为那不一定是临时目录。获取临时目录的正确方式是调用 System.IO.Path.GetTempPath() - David Heffernan
9
虽然这篇文章可能有些过时了,但我想留下一条注释供任何感兴趣的人参考:不仅不一定是临时目录,就像 @DavidHeffernan 所说,而且你根本不知道它是什么。在.NET方面可能没有太大的问题,但这被认为是不好的做法,因为任何恶意用户都可以更改环境变量以利用你的程序。如果你正在使用管理员权限,并且恶意软件可以在执行代码时更改你的代码,他们就可以将shellcode作为管理员执行,因为它已经存储在TEMP中。 - sraboy
GetEnvironmentVariable("TEMP")GetTempPath()之间有两个主要区别。GetTempPath()首先检查“TMP”变量,然后是“TEMP”,最后是“USERPROFILE”。如果没有找到任何一个,它将返回Windows文件夹的路径。它还保证返回正确的路径,但不能保证该路径存在。 - Logman
但是如果您没有TMP变量(最近的Windows版本中的默认情况),这正是接受的答案所做的事情,不是吗? - PRMan
3
GetTempPath 无论如何都依赖于您的环境变量,如果您阅读内核文档,用户Logman指出没有理由不使用 GetEnvironmentVariable ... 他们俩都有同样的弱点。 - AnorZaken

27

我有同样的需求 - 我们想把日志放在特定的根目录中,这个根目录应该存在于环境中。

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
如果我想与子目录组合,我应该能够使用Path.Combine( ... )GetFolderPath方法有一个重载的特殊文件夹选项,允许您控制指定路径是创建还是仅验证。

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