在运行时找出文件的路径

finding out the path to a file at runtime

本文关键字:路径 文件 运行时      更新时间:2023-10-16

在一个程序中,我在运行时打开一个文件,比如file.dat。问题是当我运行可执行文件时,它希望文件位于执行它的目录中。我希望程序查看存在可执行文件的同一目录。我应该在我的程序(或构建系统)中进行哪些修改。

例如,考虑以下程序:

int main()
{
std::ifstream ip("file.dat");
// do something.

return 0;
}

我正在使用 g++-4.6 编译器和 CMake 构建系统在 Ubuntu 上工作。由于该项目支持源代码外构建,这意味着程序可执行文件可以在任何地方,具体取决于从中调用cmake的目录。

感谢您的帮助...

在许多系统上,argv[0] 参数将具有用于执行程序的路径。这是否是程序的完整路径取决于它的调用方式。

int main (int argc, char *argv[]) {
    std::string progname(argv[0]);
    std::string datafile;
    if (progname.find_last_of('/') != std::string::npos)
        datafile = progname.substr(0, progname.find_last_of('/')+1);
    datafile += "file.dat";
    std::ifstream ip(datafile.c_str());
    //...
}

在 Linux 上,阅读/proc/self/exe 是最好的方法。

  char app_path[1024];
  ssize_t len = ::readlink("/proc/self/exe", app_path, sizeof(app_path)-1);
  if (len != -1) {
    app_path[len] = '';
  } else {
    // handle error
  }

有关其他操作系统,请参阅:https://stackoverflow.com/a/1024937/105015