【问题标题】:A good way to know path to resources in a paths/installation/build independant way以路径/安装/构建独立方式了解资源路径的好方法
【发布时间】:2012-09-18 17:15:10
【问题描述】:

在我的 GNU/Linux 环境中,我的软件的所有图形资源都安装在 /usr/share/pixmaps 下。在 Wintendo 中,一切都会进入C:\Program files\myappname。在不同的操作系统中,在其他地方。

什么是最常见的方式、约定和良好实践,以便我可以抽象出我的方式来引用我在代码中以独立于路径/安装/构建的方式打开的文件?基本上是一种引用资源路径的可移植方式。

【问题讨论】:

  • 最简单的方法可能是有一个配置文件,每个操作系统约定一个,它将描述安装文件的路径。
  • OT:在 Windows 上,根据数据的上下文(全局配置、每用户配置、每用户数据文件、公共数据文件、等等。)。它是正确的,但它也是应遵守的 UAC 问题,否则您可能会在未来遇到问题。查看 SHGetKnownFolderPath 上的 API 文档以获取更多信息。我之所以提出它只是因为您提到您希望在 Windows 中以受支持的方式执行此操作,而 C:\Program Files 在大多数情况下不是一个好的选择,甚至不是一个有效的选择。
  • @WhozCraig 我说的是程序本身的数据文件,完全是静态数据。我会看看 SHGetKnownFolderPath,谢谢你的建议。

标签: c++ c path convention


【解决方案1】:

创建一个预处理器ifelse 操作系统链定义#defines 一个映射到检索正确路径的真实函数调用的函数名称:

#if _WIN32
#define GetResourcesFolderString GetResourcesFolderStringW
#elif ((macintosh) || (Macintosh) || (__APPLE__ & __MACH__))
#define GetResourcesFolderString GetResourcesFolderStringM
#elif __gnu_linux__
#define GetResourcesFolderString GetResourcesFolderStringU
//...and so on
#endif

//...Later...

std::string GetResourcesFolderStringW() {
    return "C:/Program files/myappname/"
}
std::string GetResourcesFolderStringM() {
    return "Mac folder path here";
}
std::string GetResourcesFolderStringU() {
    return "/usr/share/pixmaps/";
}

这样您只调用一个函数,并且根据您的构建目标调用正确的函数而不更改代码。

硬编码路径通常不是一个好主意,此处仅用于说明目的。您可能应该设置一个配置文件或类似文件,以允许各个系统具有单独的安装路径并且仍然能够找到资源。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多