在Linux上运行程序的目录?

嘿,我一直在编写一个程序(一种电子书阅览types的东西),它从可执行文件所在的文件夹中加载文本文件。 这给了我一个问题,因为如果我运行程序从另一个目录与命令“./folder/folder/program”例如,我的程序不会find文本,因为工作目录不正确。 我不能有一个绝对的目录,因为我想程序是可移植的。 是否有任何方法可以获取可执行文件正在运行的精确目录,即使它已经从不同的目录运行。 我听说可以结合使用argc [0]和getcwd(),但argc在目录中有空格的时候会被截断(我想呢?),所以我想避免这种情况。

我在Linux上使用g ++,Thanx

编辑 – 不要使用getcwd(),它只是用户不在可执行文件的位置。

详情请看这里 。

在linux / proc / <pid> / exe或/ proc / self / exe应该是一个符号链接到您的可执行文件。 和其他人一样,我认为更重要的问题是“为什么你需要这个?” 使用可执行路径来查找辅助文件不是真正的UNIX形式。 而是使用环境变量或默认位置,或者按照其他约定之一来查找辅助文件的位置(即〜/。<myapp> rc)。

当你添加一本书到你的图书馆,你可以记住它的绝对路径。
当你的程序依赖于从工作目录启动而不是从其他目录启动时,这并不是一件坏事。 这就是为什么有“工作目录”参数的各种“链接”。

你不必以你想要的方式处理这种情况。 只要检查是否有所有必要的文件和目录结构,并记录错误的指示,如果不是。

或者每次当你的程序启动时,没有找到必要的文件,程序可以要求指向书库的路径。

我仍然没有看到理解你当前的dir名字的理由。

 #include <boost/filesystem/convenience.hpp> #include <iostream> #include <ostream> int main(int argc, char** argv) { boost::filesystem::path argvPath( argv[0] ); boost::filesystem::path executablePath( argvPath.parent_path() ); boost::filesystem::path runPath( boost::filesystem::initial_path() ); std::cout << executablePath << std::endl; std::cout << runPath << std::endl; return 0; } 

您可以通过阅读命令行来获取正在运行的程序的路径。 在linux中,你可以通过/ proc / PID / CommandLine读取/ proc文件夹来得到命令行

有空格时, argv[0]不会被截断。 但是,从PATH环境变量中列出的目录运行程序时,它只有程序名称,而不是路径。

无论如何,你在这里做的是不是Unix / Linux程序的好设计。 数据文件不存储在与程序文件相同的目录中,因为这样做会很难应用适当的安全策略。

在我看来,最好的方法是使用shell脚本启动实际的程序。 这与Firefox在Linux系统上的启动非常相似。 shell将脚本的名字放到$0 ,这个变量总是有一个路径。 然后,您可以使用环境变量或命令行参数为您的程序提供数据文件的位置,如下所示:

 dir=`dirname "$0"` cd "$dir/../data/" "$dir/real-program" 

我会安排你的程序,以便它的文件有点像这样:

 install-dir/bin/program install-dir/bin/real-program install-dir/etc/config install-dir/data/book-file.mobi