C / C ++ - 可执行路径

时间:2011-12-20 17:00:12

标签: c++ c path

我想获取当前可执行文件的文件路径,但最后没有可执行文件名。

我正在使用:

char path[1024];
uint32_t size = sizeof(path);
if (_NSGetExecutablePath(path, &size) == 0)
    printf("executable path is %s\n", path);
else
    printf("buffer too small; need size %u\n", size);

它可以工作,但这会在最后添加可执行文件名。

5 个答案:

答案 0 :(得分:3)

dirname(path); 在获取路径后,应该返回没有可执行文件的路径,即在Unix系统上,对于Windows,你可以做一些strcpy / strcat魔法。

对于dirname,您需要包含#include <libgen.h> ...

答案 1 :(得分:1)

使用dirname

答案 2 :(得分:1)

Ubuntu的最佳解决方案!!

std::string getpath() {
  char buf[PATH_MAX + 1];
  if (readlink("/proc/self/exe", buf, sizeof(buf) - 1) == -1)
  throw std::string("readlink() failed");
  std::string str(buf);
  return str.substr(0, str.rfind('/'));
}

int main() {
  std::cout << "This program resides in " << getpath() << std::endl;
  return 0;
}

答案 3 :(得分:0)

char* program_name = dirname(path);

答案 4 :(得分:0)

对于Linux:
执行系统命令的功能

int syscommand(string aCommand, string & result) {
    FILE * f;
    if ( !(f = popen( aCommand.c_str(), "r" )) ) {
            cout << "Can not open file" << endl;
            return NEGATIVE_ANSWER;
        }
        const int BUFSIZE = 4096;
        char buf[ BUFSIZE ];
        if (fgets(buf,BUFSIZE,f)!=NULL) {
            result = buf;
        }
        pclose( f );
        return POSITIVE_ANSWER;
    }

然后我们得到应用名称

string getBundleName () {
    pid_t procpid = getpid();
    stringstream toCom;
    toCom << "cat /proc/" << procpid << "/comm";
    string fRes="";
    syscommand(toCom.str(),fRes);
    size_t last_pos = fRes.find_last_not_of(" \n\r\t") + 1;
    if (last_pos != string::npos) {
        fRes.erase(last_pos);
    }
    return fRes;
}

然后我们提取申请路径

    string getBundlePath () {
    pid_t procpid = getpid();
    string appName = getBundleName();
    stringstream command;
    command <<  "readlink /proc/" << procpid << "/exe | sed \"s/\\(\\/" << appName << "\\)$//\"";
    string fRes;
    syscommand(command.str(),fRes);
    return fRes;
    }

不要忘记在

之后修剪线条