【问题标题】:Getting path of system TEMP variable获取系统 TEMP 变量的路径
【发布时间】:2020-11-09 19:52:24
【问题描述】:

我想在我的 C++ 代码中访问系统 TEMP 变量。当我使用 getenv("TEMP") 时,它会在用户变量(“C:\Users\xxxx\AppData\Local\Temp\”)中给出 TEMP 的值,而不是系统变量。

同样,GetTempPath 也返回 C:\Users\xxxx\AppData\Local\Temp\,因为我想从系统 (C:\Windows\Temp) 获取 TEMP 变量的路径。

如何获得?

【问题讨论】:

  • 请说明您对TEMP 变量的期望;它应该包含什么?
  • 很难知道你的期望是什么。我的猜测是,您有一些在特定上下文(可能是服务)中执行的代码,并且您想要获取此代码使用的临时目录。这段代码是什么,执行上下文是什么?
  • 对不起,我不明白为什么这很困难。我有一个第三方 exe,它将一些文件写入配置为 TEMP 系统变量(不是用户变量)的路径。我想检查文件是否存在。所以我必须得到TEMP系统变量的路径。
  • @user6771624 - 打开此 exe 进程的令牌并使用 CreateEnvironmentBlock。困难,因为你的问题表述不当 - 不清楚
  • 我不知道这有什么不清楚的地方?问题简单吗?如何获取系统变量 TEMP 的值

标签: c++ windows winapi


【解决方案1】:

%USERPROFILE%\AppData\Local\Temp\ 路径 IS 是您在大多数情况下应该使用的正确 TEMP 文件夹。这是像getenv("%TEMP%"|"%TMP%")GetTempPath() 这样的API 按用户设计返回的文件夹。您根本不应该使用 C:\Windows\Temp\ 文件夹,因为这是一个供 Windows 内部使用的系统文件夹。

话虽如此,如果你真的想得到系统%TEMP%路径,那么你可以:

  • 使用getenv("%WINDIR%"|"%SYSTEMROOT%")GetWindowsDirectory()SHGetFolderPath(CSIDL_WINDOWS)SHGetKnownFolderPath(FOLDERID_Windows)获取Windows安装文件夹的路径,然后将Temp附加到该路径的末尾。

  • 读取HKLM\System\CurrentControlSet\Control\Session Manager\Environment 注册表项中的"TEMP""TMP" 值。

【讨论】:

  • 谢谢。是的,我不使用它来写作。我需要查询系统变量 TEMP 的路径来查找文件。另一条路线是一种解决方法,只是我的意思是获取 GetWindowsDirectory 并将 temp 附加到它。因为如果由于某种原因它被编辑到其他路径(未设置为 C:\Windows\Temp ),那么它是错误的
  • @user6771624 您能解释一下“查找变量”是什么意思吗?目录包含文件,而不是变量。您在 TMEP 目录中寻找什么变量?
  • @RaymondChen OP 没有说“查找变量”,他们说在系统TEMP 变量指定的文件夹中“查找文件”。
  • 对不起,这是一个错字。我不是在寻找变量。我正在寻找一个文件。
  • 最好让创建文件的代码告诉你它在哪里,而不是让你去搜索它。创建文件的代码还可以设置 ACL,以便您在获得它后就可以访问它。
【解决方案2】:

没有用于读取(或编辑)系统环境变量的 Win32 API。 Environment Variables 的参考文档指向存储系统环境以操作系统变量的注册表项。

要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 注册表项,然后广播 WM_SETTINGCHANGE 消息,并将 lParam 设置为字符串“Environment”。

【讨论】:

  • 这是以编程方式设置或修改的。我没有看到任何要查询的内容。我也检查了 SystemParametersInfo。无标志查询环境
  • 没有 API 可以查询 system 环境。您必须使用标准注册表 API(RegOpenKeyEx()RegGetValue()/RegQueryValueEx())从记录的键中查询值。
  • @user6771624 您只需使用通常的注册表函数读取 TEMP 的值,例如参见 How to read a value from the Windows registry。尽管阅读了有关该问题的后续内容,但我不再清楚您是否实际上是指系统 TEMP 变量与特定运行进程中的 TEMP 变量,这不一定相同。
【解决方案3】:

这个:GetEnvironmentVariable(String, EnvironmentVariableTarget) 表示您可以通过Machine 获得它:

环境变量从 Windows 操作系统注册表中的 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 键存储或检索。此值应仅用于在 Windows 系统上运行的 .NET 实现。

这让我相信IS有一个 Win32 API 来获取它...

【讨论】:

猜你喜欢
  • 2020-06-28
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多