【问题标题】:C++ - How to get the user folder?C++ - 如何获取用户文件夹?
【发布时间】:2014-02-21 02:21:24
【问题描述】:

我的程序有点问题...

我必须使用应用程序数据创建一个文件,但我不知道如何访问 %USER%%APPDATA% 目录...

我尝试使用应用程序文件夹,但是如果我将应用程序安装在D:\Program Files\(Organization)\(APPName) 中,我无法在此目录中写入新文件,如果我没有管理员权限,我只能读取或修改...

所以,问题是:如何访问 %USER% 文件夹或使用应用程序获取 ADMIN 权限... PS.:我在 C++ Builder 中使用 VCL

【问题讨论】:

  • 你试过this吗?

标签: c++ directory vcl


【解决方案1】:

一种经典的方法是使用 getenv 读取环境变量:

char *user = getenv("USER");
char *appdata = getenv("APPDATA");

关于用户权限和在这些位置执行文件读/写/创建,您当然可以在应用程序运行的用户文件夹中。在其他文件夹中,您需要以目标用户或管理员身份运行它。 此外,在 Program Files 或 Program Files (x86) 中安装应用程序后,系统将不允许您在那里写入。安装在“trustedinstaller”用户凭据下执行,最终用户权限在安装期间为“当前用户”或“所有用户”设置。

希望这会有所帮助。

【讨论】:

  • 但是,它只是一个 var... 它可以与 VCL 一起使用吗?而且我必须包含另一个库才能工作?
  • 安装通常不由 TrustedInstaller 执行。使用getenv 不是获取此信息的正确方法。
  • @David Heffernan:我提到“一种经典方式”而不是“唯一方式”。这也可以移植到其他平台以读取环境变量,其中特定于 Windows 的 API 已经更改了很多次,尽管 Microsoft 努力保持向后兼容性。通过“安装”,我指的是默认 Windows 安装 (msi),它实际上在后期 Windows 化身中使用了 TrustedInstaller 帐户。
  • @mauroaraujo:这是标准的 C 调用,实际上也适用于 C++。它包含在标准运行时中。
  • @DNT 你依赖于创建你的进程设置适当的环境变量的东西。
【解决方案2】:

假设这是一个纯 Windows 问题,您应该使用SHGetSpecialFolderPath

  • 传递CSIDL_PROFILE 以获得%USERPROFILE% 的等价物。
  • 传递CSIDL_APPDATA 以获得%APPDATA% 的等价物。

请注意,基于 CSIDL 的函数的文档有点吓人,因为它们谈到了不支持或不推荐使用的函数。相反,他们敦促您使用SHGetKnownFolderPath。如果您的程序永远不需要在 XP 上运行,那很好。如果是这种情况,请继续使用SHGetKnownFolderPath。否则,请使用基于 CSIDL 的选项。

【讨论】:

  • 但是,我可以使用“CSIDL_APPDATA\\Local\(Organization)\(Application)”作为有效目录吗?
  • 这个问题对我来说没有多大意义。能否详细说明。
  • 例如:我想使用 "C:\\users\\%USER%\\AppData\\Local\(Application)"... 那么,我可以这样使用这个函数吗: “CSIDL_APPDATA\\本地(组织)(应用程序)”?
  • 为什么要本地而不是漫游?这是非常不寻常的。对于本地你想要CSIDL_LOCAL_APPDATA。请注意,您接受的答案会为您提供漫游应用数据。
  • 哦,好吧...但是,如何使用此功能保存 .txt 文件?
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多