0

私のプログラミング言語のインタプリタでは、import関数が呼び出された場合に備えて、パーツを正しく処理する必要があります。次に、そのようなファイルが/libsフォルダー(実行可能ファイルと同じ場所にあります!)にあるかどうかを確認する必要があります。存在しない場合は、現在のスクリプトのディレクトリを確認する必要があります。

  • argvから実行可能ファイルが配置されているディレクトリへの正確なパスを取得するにはどうすればよいですか?
  • パスの末尾からファイルを削除する最良の方法は何ですか。例:

    C:/a/b/c/file.exeになる必要がありますC:/a/b/c/

4

6 に答える 6

2
  1. それを行う保証された方法はありません。調べてみることができますが、argv[0]それがフルパスであるか、バイナリの名前だけであるかは、プラットフォームとプロセスがどのように呼び出されたかによって異なります。
  2. strrchr最後のスラッシュを見つけて、その後の文字を次のように置き換えるために使用できます'\0'

コード例:

// Duplicate the string so as not to trash the original
// You can skip this if you don't mind modifying the original data
// and the originald is writeable (i.e. no literal strings)
char *path = strdup(...);

char *last_slash = strrchr(path, '/');
if (last_slash)
{
#if PRESERVE_LAST_SLASH
    *(last_slash + 1) = '\0';
#else
    *last_slash = '\0';
#endif
}
于 2010-04-09T17:55:38.460 に答える
2

Linux(およびおそらく他の* nix)で移植できない方法は、argv [0]にパス全体が含まれていない場合、/ proc / self/exeでreadlinkを使用することです。

于 2010-04-09T18:04:24.400 に答える
1

ご使用の環境にPWDと同等の環境がある場合は、/ $argv[0]を追加するだけです。

これにより、/ foo1 / foo2 / ../ foo3 /のように予期しないものが得られる可能性がありますが、問題ありません。これは有効なパスであり、グロブすることができます。

于 2010-04-09T18:13:34.537 に答える
0

文字列の末尾から逆方向にスキャンして、最初の'/'文字を探します。

于 2010-04-09T17:55:38.970 に答える
0

最適ではありませんが、正常に機能します。

int main(int argc, char **argv) {
    using namespace std;
    char buffer[MAXPATHLEN];
    realpath(argv[0], buffer);
    string fullpath = buffer;
    fullpath = string(fullpath, 0, fullpath.rfind("/"));
    cout << fullpath << endl;
}

相対パスには、unix / linux固有のrealpath()を使用しています。Windowsの場合、GetModuleFileName(NULL、buffer、MAXPATHLEN)を使用できますが、もちろんセパレーターは同じではありません。

于 2010-04-09T18:12:45.443 に答える
0

Windows(移植性がない)の場合は、:: GetModuleFileName()および:: PathRemoveFileSpec()を使用します。

TCHAR sPath[MAX_PATH] = {0};
if(::GetModuleFileName(NULL, sPath, MAX_PATH))
    ::PathRemoveFileSpec(sPath))
// sPath is the executable path if the module is an exe
于 2010-04-09T19:18:16.010 に答える