とある事情で、プログラムを実行したときにカレントディレクトリではなくプログラムがあるディレクトリを取得したいと思って調べてみました。ニュアンスとしては、iniファイルを読み込むようなシチュエーションを思い浮かべると分かりやすいかも。
#include <stdio.h> #include <stdlib.h> #include <windows.h> int main(int argc, char **argv){ char path[256], drive[256], dir[256], file[256], ext[256]; GetModuleFileName(NULL, path, sizeof(path)/sizeof(char)); _splitpath(path, drive, dir, file, ext); printf("path = %s\n",path); printf("drive = %s\n",drive); printf("dir = %s\n",dir); printf("file = %s\n",file); printf("ext = %s\n",ext); _makepath(path, drive, dir, file, ".ini"); printf("path = %s\n",path); return 0; }
$ ./path.exe path = d:\work\pathtest\path.exe drive = d: dir = \work\pathtest\ file = path ext = .exe path = d:\work\pathtest\path.ini
MinGWのgccだと、argv[0]にフルパスでプログラムへのパスが入るみたい。Cygwinのgccだと実行したコマンドしか入んないんだけどねー。
ところで、GetModuleFileName()はWindowsのAPIなんだけど、UNIX環境ではどうするんだろ?と思ったけど、考えてみればUNIXは/etc以下に決めうちだよな・・・
というか、splitpath/makepathもWindows環境依存な気がしてきた。UNIXのパスにはドライブなんて概念はないもんなあ・・・。軽くgrepしてみた限りでは、splitpathという関数はなさそう。