在不知道工作目录的情况下打开项目中特定文件的方法

Methods for opening a specific file inside the project WITHOUT knowing what the working directory will be

我在许多语言中都遇到过这个问题,最近是在 C++ 中。

例证的问题

假设我们正在使用 C++ 并具有以下项目文件结构:
("Project" main folder with three [modules, data, etc] subfolders)

现在说:

  1. 我们的maincode.cpp项目文件夹中
  2. moduleA.cppmodules 文件夹中
  3. data.txtdata 文件夹中
  4. moduleA.cpp想读data.txt

所以我目前的做法是假设 maincode.cpp项目中编译和执行文件夹,因此 硬编码 moduleA.cpp 中的路径 data/data.txt 进行读取(假设我使用 fstream fs("data/data.txt") 进行读取)。
但是,如果代码出于某种原因在 etc 文件夹中执行怎么办?
有解决办法吗?

问题

  1. 这是一个有效的问题吗?还是我遗漏了 wd(工作目录)概念基础知识?
  2. 在 C++ 中是否有任何绕过绝对路径的方法来解决这个问题?
  3. 有没有通用的方法可以用任何语言做同样的事情?
  4. 如果没有合理的方法,你会怎么处理这个问题?

如果我遗漏了问题插图中的任何重要细节,请发表评论!

在某些时候,程序必须假设文件的位置。通过从用户输入或具有假定文件名的相对路径获取它。正如评论中所说,C++ 最近在 C++17 中添加了 std::filesystem,这可以帮助您制作 cross-platform 与主机文件系统交互的代码。

话虽这么说,每个程序,无论大小,都必须在某个时候做出某些假设,删除或移动某些文件对任何程序来说都是有问题的,因为程序要求它们位于特定位置下的特定位置姓名。除了向用户显示错误消息等之外,这是无法解决的。

你的程序可以从主调用中的 argv[0] 推断出路径,如果你知道它总是相对于你的可执行文件或者你使用像 "C:\myProgram\data\data.txt 这样的绝对路径”。 第二种方法适用于所有语言。

正如@Hatted Rooster 所说,如果不做一些假设,它通常无法解决某些任意文件,但是有些框架允许您将某些文件“存储”在嵌入可执行文件(或其他方式)的资源中。这些框架通常允许您以不透明的方式处理此类文件,而无需依赖当前的工作目录或相对路径。

例如,参见 the Qt Resource System