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


395

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

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 \


2
System.Environment.GetEnvironmentVariable(“ TEMP”)的行为与GetTempPath()相同。在我的机器中,帐户“管理员”的两个API均返回“ C:\ WINDOWS \ TEMP”,但对于帐户“网络服务”的两个API均返回“ C:\ Documents and Settings \ Network Service \ Local Settings \ Temp \”。
Anoop

1
也许“管理员”帐户确实有一个C:\ Windows \ Temp临时文件夹?
海伦

2
有什么特定的原因为什么要始终在C:\ Documents and Settings \下获得临时路径?
Noldorin

11
仅供参考:如果您确实想要系统临时文件夹,而不是用户的文件夹(如果已设置),则可以使用Environment.GetEnvironmentVariable(“ temp”,EnvironmentVariableTarget.Machine)
piers7

1
过去,我经常使用临时文件夹,并且从不在乎它的位置,只要可以进行清理,这样就不会完全消耗光盘。临时文件夹不是临时用途-垃圾占位符吗?为什么它不为人所知并由API处理?您是否应该使用可配置的知名位置而不是临时位置?
barrypicker

Answers:


405

System.IO.Path.GetTempPath()只是GetTempPath(..)Kernel32中本机调用的包装。

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

从该页面复制:

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

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

我不清楚“ Windows目录”是指Windows下的temp目录还是Windows目录本身。在Windows目录中转储临时文件本身听起来像是不受欢迎的情况,但谁知道呢。

因此,将该页面与您的帖子结合在一起,我会猜出您的Administrator用户的TMP,TEMP或USERPROFILE变量之一指向Windows路径,否则未设置它们,并且回退到Windows临时路径。


14
TEMP环境变量将在两个地方设置:用户本身,并为本地计算机。如果未为用户设置,则将使用本地计算机的设置,并且始终在默认安装中设置。因此,搜索通常在第二步上停止。在测试中,如果TMPTEMPUSERPROFILE全部被复位,它实际上确实回落至%SystemRoot%C:\Windows\)。
Bob

1
在“本地系统”下运行的Windows Services或由此类服务启动的应用程序中执行的代码,有时将C:\ Windows \ Temp文件夹用作termporary文件夹。
NineBerry

1
您链接中的文档说:“返回的字符串以反斜杠结尾,例如“ C:\ TEMP”。但是他们的示例实际上并未以反斜杠结尾
。– dcp

您不能保证对应用程序中该函数返回的路径具有写权限。如果您改用IsolatedStorage怎么办?
约翰,

35

请勿使用此:

System.Environment.GetEnvironmentVariable("TEMP")

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

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


34
@ImmortalBlue因为这不一定是临时目录。获取临时目录的正确方法是调用System.IO.Path.GetTempPath()
David Heffernan

9
我知道这已经很老了,但我想我会给任何好奇的人留下笔记:不仅像@DavidHeffernan所说的那样,它不一定是temp目录,而且您根本不知道它是什么。.NET并不是什么大问题,但它被认为是不好的做法,因为任何恶意用户都可以更改该环境变量以利用您的程序。如果您以管理员权限运行,并且该恶意软件可以在执行代码时更改您的代码,则它们可以例如以管理员身份执行shellcode,因为该代码已存储在TEMP中。
sraboy

GetEnvironmentVariable("TEMP")和之间有2个主要区别GetTempPath()GetTempPath()首先检查“ TMP”变量,然后检查“ TEMP”,最后检查“ USERPROFILE”。如果找不到这些,则返回Windows文件夹的路径。它还保证返回正确的路径,但不保证路径存在。
Logman

但是,如果您没有TMP变量(最新Windows版本的默认方案),这就是接受的答案,不是吗?
PRMan

1
GetTempPath无论如何,如果您阅读了内核文档,则仍然依赖于环境变量,因此,正如Logman用户指出的那样,没有理由不使用GetEnvironmentVariable它们……它们都具有相同的弱点。
AnorZaken

22

我也有同样的要求-我们想将日志放在环境中应该存在的特定根目录中。

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

如果要将其与子目录结合使用,则应该可以使用Path.Combine( ... )

GetFolderPath方法具有特殊文件夹选项的重载,该重载使您可以控制是创建还是简单地验证指定的路径。


-8

尝试

Environment.GetEnvironmentVariable("temp");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.