2011-12-20 34 views
2

最後に実行可能ファイル名がない現在の実行可能ファイルのパスを取得したいとします。C/C++ - 実行可能なパス

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); 

それは動作しますが、これは最後に実行可能ファイル名を追加します。

私が使用しています。

答えて

3

dirname(path); あなたがしてパスを取得した後のウィンドウのためにあなたには、いくつかのstrcpy/strcatのマジックを行うことができ、それはUnixシステム上で、実行せずにパスを返す必要があります。あなたがLinuxの場合#include <libgen.h> ...

+0

OPはMac OS X関数を呼び出しているので、彼はUnixルーチンにアクセスできます。 – chrisaycock

+0

SHLWAPIを持ち込んでも構わない場合は、ウィンドウでPathRemoveFileSpecを使用できます。または_splitpath_s – Stewart

+0

私は_splitpath xDを忘れてしまいました。@chrisaycockについては、ごめんなさい、idk mac API –

0

を含める必要がdirnameのために


機能

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; 
    } 


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; 
} 
関連する問題