我有一个C ++项目,其文件夹结构如下:
root/trunk
root/trunk/src/...
root/trunk/include/...
root/trunk/utils/... <-- this has the `main` programs which are compiled
root/trunk/bin/... compiled binaries
root/data/... data used in the programs
在我的源文件中,我有时会引用数据子文件夹中包含的文件。我希望我使用的路径是相对路径(因为我与其他人共享此项目)。
如何确保始终可以找到数据文件?目前我使用如下路径:
std::string my_data("../../../data/path/to/file.txt");
但是,我发现很难用它来计算相对路径所在的位置,并且在移动源文件时会很麻烦。是完成同样事情的更好方法吗?
答案 0 :(得分:2)
您不应该对程序运行时当前工作目录的内容做出任何假设 - 使用更健壮的方法来确定数据文件的位置,这不依赖于工作目录设置为任何内容特别是。通过将工作目录设置为与程序无关的位置进行测试,然后从那里运行它,例如
$ cd /tmp
$ /path/to/my/program/root/trunk/bin/my_program
并查看它是否正常运行。
答案 1 :(得分:2)
在继续之前,您需要定义一个交付目录
结构体;其他用户在安装代码时会看到的内容。然后,
从那开始:在Windows下,您可以使用该功能
GetModuleFileName
找到二进制文件的位置,并从中工作
那;在Unix下,传统上要求用户设置
环境变量,类似于MYPROJ_ROOT
,并将其用作
树的根。无论哪种方式,你都有一个起点;你想要你的
文件名相对于此,不到当前工作目录。
您可以通过更改当前工作目录来执行此操作
您的流程(Windows下为SetCurrentDirectory
,Unix下为chdir
),
或者(我的首选解决方案)使用boost::filesystem
之类的东西
从根名称建立绝对名称。
答案 2 :(得分:1)
组织数据文件的常用方法是在程序启动时建立“数据根”文件夹,然后相对于此编码路径。数据根可以通过搜索(当前目录,也许是其父,祖父等等,直到真正的根目录)自动确定特定命名的文件或目录(例如“.foo”),并由环境变量覆盖或命令行开关(例如FOO_DATA_DIR =“/ home / fred / bar”)。
为方便起见,程序可以将其当前工作目录更改为数据根目录,或者您可以在用户空间中以编程方式解析数据根目录相对路径。
答案 3 :(得分:0)
在您的问题中没有足够的代码来确切地了解您正在做什么,但在过去,我已经使用__FILE__
预处理器宏(以及随后删除的文件名/目录)来引用文件它们与源文件所在的位置相关: