How to get temporary folder for current user
当前我正在使用以下函数获取当前用户的临时文件夹路径:
1
| 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\
- System.Environment.GetEnvironmentVariable("temp")的行为与GetTempPath()相同。在我的计算机中,帐户"administrator"的两个api都返回"c:windows emp",而帐户"network service"的两个api都返回"c:documents and settingsetwork servicelocal settings emp"。
- 也许"administrator"帐户的临时文件夹是C:windows emp,真的吗?
- 是否有任何特定的原因要在c:documents and settingsalways下获取临时路径?
- 仅供参考:如果您想要System Temp文件夹,而不是用户的(如果已设置),则可以使用environment.getenvironmentvariable("temp",environmentvariabletarget.machine)
- 在过去,我经常使用临时文件夹,从不关心它在哪里,只要清理可以发生,这样光盘就不会完全被消耗掉。临时文件夹的位置不是临时使用的吗-垃圾邮件占位符?为什么它不能是未知的并由API处理?您应该使用可配置的、众所周知的位置而不是临时位置吗?
System.IO.Path.GetTempPath()只是kernel32中本地调用GetTempPath(..)的包装。
请访问http://msdn.microsoft.com/en-us/library/aa364992(vs.85).aspx
从该页复制:
The GetTempPath function checks for the existence of environment variables in the following order and uses the first path found:
-
The path specified by the TMP environment variable.
-
The path specified by the TEMP environment variable.
-
The path specified by the USERPROFILE environment variable.
-
The Windows directory.
我不完全清楚"windows目录"是指windows下的临时目录还是windows目录本身。在Windows目录中转储临时文件本身听起来是一个不受欢迎的情况,但谁知道呢。
因此,将该页面与您的文章结合起来,我猜想管理员用户的tmp、temp或userprofile变量中的任何一个指向Windows路径,或者它们没有被设置,它将回退到Windows temp路径。
- TEMP环境变量将在两个位置设置:用户本身和本地机器。如果没有为用户设置,那么将使用本地计算机的设置,并且在默认安装中总是设置该设置。因此搜索通常在第二步停止。在测试中,如果TMP、TEMP和USERPROFILE均未设置,则实际返回%SystemRoot%(C:\Windows\)。
- 在"本地系统"下运行的Windows服务中或在由此类服务启动的应用程序中执行的代码,C:windows emp文件夹有时用作termporary文件夹。
- 链接中的文档这样说:"返回的字符串以反斜杠结尾,例如,"c: emp"。但他们的例子并没有以反斜杠结尾。
请勿使用:
1
| System.Environment.GetEnvironmentVariable("TEMP") |
环境变量可以被重写,因此TEMP变量不一定是目录。
正确的方法是在接受的答案中使用System.IO.Path.GetTempPath()。
- @因为这不一定是临时目录。获取temp目录的正确方法是调用System.IO.Path.GetTempPath()。
- 我知道这很古老,但我想我会给任何好奇的人留个便条:正如@davidheffernan所说,这不仅不一定是临时目录,而且你根本不知道它是什么。虽然.NET的问题不多,但它被认为是糟糕的做法,因为任何恶意用户都可能为了利用您的程序而更改该环境变量。如果您以管理员权限运行,并且恶意软件可以在代码执行时更改代码,那么它们可以以管理员身份执行shellcode,因为它存储在temp中。
- GetEnvironmentVariable("TEMP")和GetTempPath()有两个主要区别。GetTempPath()首先检查"tmp"变量,然后检查"temp",最后检查"userprofile"。如果找不到其中任何一个,则返回到Windows文件夹的路径。它还保证返回正确的路径,但不保证路径存在。
- 但是,如果没有tmp变量(在最新的Windows版本中是默认的场景),接受的答案就是这样的,不是吗?
- GetTempPath无论如何都依赖于您的环境变量,如果您阅读内核文档,那么正如用户logman指出的那样,没有理由不使用GetEnvironmentVariable…他们都有同样的弱点。
我有同样的要求——我们希望将日志放在环境中应该存在的特定根目录中。
1
| public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); |
如果我想把它与子目录结合起来,我应该可以使用Path.Combine( ... )。
GetFolderPath方法有一个特殊文件夹选项的重载,它允许您控制是创建指定路径还是简单地验证指定路径。
尝试
1
| Environment.GetEnvironmentVariable("temp"); |