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

Ano*_*oop 384 .net c# temporary-directory

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

string tempPath = System.IO.Path.GetTempPath();
Run Code Online (Sandbox Code Playgroud)

在某些机器上它给我当前用户的临时文件夹路径,如:

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

在某些机器上它给我系统临时文件夹路径,如:

C:\ WINDOWS\TEMP

MSDN文档还说上面的API返回当前系统的临时文件夹.

是否有任何其他API可以为我提供当前用户的临时文件夹路径,如下所示:

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

Nia*_*ton 397

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

看看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临时路径.

  • `TEMP`环境变量将设置在两个位置:用户本身和本地计算机.如果没有为用户设置,那么将使用本地计算机的那个,并且始终在默认安装中设置.因此,搜索通常在第二步停止.在测试中,如果`TMP`,`TEMP`和`USERPROFILE`都未设置,它实际上*会回退到'%SystemRoot%`(``C:\ Windows \``). (14认同)

Hel*_*len 29

不要使用这个:

System.Environment.GetEnvironmentVariable("TEMP")
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ImmortalBlue因为那不一定是临时目录.获取临时目录的正确方法是调用`System.IO.Path.GetTempPath()`. (33认同)
  • 我知道这已经很老了,但我想我会给好人留下一张纸条:不仅不一定是临时目录,正如@DavidHeffernan所说,但你根本不知道它是什么.虽然不是.NET的问题,但它被认为是不好的做法,因为任何恶意用户都可能已经改变了该环境变量以利用您的程序.如果您使用管理员权限运行,并且恶意软件可以在执行时更改您的代码,例如,他们可以作为管理员执行shellcode,因为它已存储在TEMP中. (7认同)
  • `GetTempPath` 无论如何都依赖于你的环境变量,如果你阅读内核文档,那么正如用户 Logman 指出的那样,没有理由不使用 `GetEnvironmentVariable` ......它们都有相同的弱点。 (2认同)

IAb*_*act 21

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

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
Run Code Online (Sandbox Code Playgroud)

如果我想将它与子目录结合起来,我应该可以使用Path.Combine( ... ).

GetFolderPath方法具有特殊文件夹选项的重载,允许您控制是创建指定路径还是仅验证.