ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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() 相同。在我的机器中,帐户“管理员”的两个 API 返回“C:\WINDOWS\TEMP”,但帐户“网络服务”的两个 API 返回“C:\Documents and Settings\Network Service\Local Settings\Temp\”。
也许“管理员”帐户确实有一个 C:\Windows\Temp 临时文件夹?
是否有任何特定原因要始终获取 C:\Documents and Settings\ 下的临时路径?
仅供参考:如果您确实想要系统临时文件夹,而不是用户的(如果已设置),您可以使用 Environment.GetEnvironmentVariable("temp", EnvironmentVariableTarget.Machine)
过去,我经常使用临时文件夹,从不关心它在哪里,只要可以进行清理,这样磁盘就不会被完全消耗掉。临时文件夹的目的不是临时使用 - 垃圾占位符吗?为什么它不能未知并由 API 处理?您是否应该使用可配置的、众所周知的位置而不是临时位置?

C
Community

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


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

不要使用这个:

System.Environment.GetEnvironmentVariable("TEMP")

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

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


@ImmortalBlue 因为那不一定是临时目录。获取临时目录的正确方法是调用 System.IO.Path.GetTempPath()
我知道这已经很老了,但我想我会给任何好奇的人留个便条:正如@DavidHeffernan 所说,它不仅不一定是临时目录,而且你根本不知道它是什么。虽然 .NET 的问题不大,但它被认为是不好的做法,因为任何恶意用户都可能更改该环境变量以利用您的程序。如果您以管理员权限运行并且恶意软件可以在执行代码时更改您的代码,例如,它们可以以管理员身份执行 shellcode,因为它存储在 TEMP 中。
GetEnvironmentVariable("TEMP")GetTempPath() 之间有 2 个主要区别。 GetTempPath() 首先检查“TMP”变量,然后检查“TEMP”,最后检查“USERPROFILE”。如果找不到其中任何一个,则返回到 Windows 文件夹的路径。它还保证它返回正确的路径,但不保证路径存在。
但是,如果您没有 TMP 变量(最新 Windows 版本的默认情况),这正是公认的答案所做的,不是吗?
如果您阅读内核文档,GetTempPath 无论如何都依赖于您的环境变量,因此用户 Logman 指出没有理由不使用 GetEnvironmentVariable ...它们都有相同的弱点。
I
IAbstract

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

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

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

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