如何使用Boost在$PATH中找到exe

How to find an exe in $PATH using Boost

本文关键字:exe PATH 何使用 Boost      更新时间:2023-10-16

我正在使用Boost库编写一个c++程序。我需要能够找到一个可执行文件的完整路径,只给名字。这将相当于Unix shell的which实用程序,Windows的where或Python的shutil.which

有办法做到这一点吗?当然,我可以通过遍历PATH环境变量来编写自己的代码,但是为了可移植性,我需要考虑在:;上进行分割等问题,如果有预先编写的(并经过测试的!)例程,我更愿意使用它。

在boost中没有直接实现这个。你可以:

  1. getenv()读取PATH的内容,使用Boost文件系统以可移植的方式处理路径,并手动处理多路径分割-似乎分割字符的数量可能不太疯狂,只是一些替代方案
  2. 调用shell现有的which程序(或其变体)
  3. 调用一个简单的python程序调用shutil.which,例如system("python -c "import shutil; shutil.which('ls');"")

"写我自己的"是通常的做法。虽然这在C语言中可能是一个麻烦,但在c++及其丰富的std::string类中,这变得无需动脑筋。甚至不需要Boost。这将是c++入门课程中典型的家庭作业:

std::string s=getenv("PATH");
const char sep=':';  // Or use ';', if you feel like it.
auto b=s.begin(), e=s.end();
while (b != e)
{
    if (*b == sep)
    {
        ++b;
        continue;
    }
    auto p=b;
    b=std::find(b, e, sep);
    auto check=std::string(p, b) + "/" + filename;
    if (access(filename.c_str(), X_OK) == 0)
    {
          // Found it. Insert code here.
    }
}

这是一个没有问题的问题,它可能会更快,只是把它删除,然后试着找到一些库函数,在某个地方,做同样的事情。