相対パスから絶対パスを取得する

最終更新 2003 11/14

サンプルのダウンロード → API_SearchPath.lzh(37k)

サンプルプログラムのスクリーンショット

全ソースコード



SearchPath 関数

    対応しているバージョン
    95, 98, Me, NT3.1以降, 2000, XP
    
    使用するヘッダとライブラリ
    winbase.h
    kernel32.lib
相対パス(パスの一部)から絶対パスを取得するには SearchPath() 関数を 使います。 思ったよりも使い勝手はよくないです。 結局は別の方法でファイル名を検索して絶対パスを取得する形になりそうです。 この関数で済むケースってどんなときなんでしょう・・・? 関数に指定する引数も少しくせものです。

SearchPath(
    パス,
    ファイル名,
    拡張子,
    受け取るパスの文字数,
    パスを格納する配列のポインタ,
    ファイル名の位置を指すポインタのポインタ
);
パス ファイル名を検索するパスを指定します。 絶対パスでないとダメみたいです。 ここに NULL を指定すると、次の順番でファイルがあるかを調べます。 1.実行ファイルのあるフォルダ 2.カレントディレクトリ 3.ウィンドウズフォルダにある SYSTEM32 フォルダ 4.ウィンドウズフォルダにある SYSTEM フォルダ 5.ウィンドウズフォルダ 6.環境変数に設定されているフォルダ ファイル名 検索するファイル名を指定します。 ファイル名の拡張子はついていてもついてなくても構いません。 拡張子 ファイル名につける拡張子を指定します。 最初の文字は必ず . (ピリオド) でないといけません。 ファイル名に拡張子がついていない場合、ここで指定した拡張子を ファイル名にくっつけて検索を行います。 ファイル名に拡張子をつけて指定した場合は、ここに NULL を 指定できます。 受け取るパスの文字数 「パスを格納する配列のポインタ」に格納できる文字数を指定します。 パスを格納する配列のポインタ ここに指定したポインタに見つかった絶対パスが格納されます。 ファイル名の位置を指すポインタのポインタ 「パスを格納する配列のポインタ」に受け取ったパスの、ファイル名が ある位置のポインタが格納されます。 例えば C:\Program Files\test.exe というパスがあった場合 test.exe の最初の文字の t が格納されている 位置のポインタになります。 なので、受け取った絶対パスからファイル名を取り出したい時は 次のようにします。

char  file[256];
char  path[MAX_PATH+MAX_PATH];
char* p_filename;
int   size = sizeof(path) - 1;

memset( file, '\0', sizeof(file) );
memset( path, '\0', sizeof(path ) );

SearchPath( NULL, file, NULL, size, path, &p_filename );

// file_name に受け取ったパスのファイル名を格納

char file_name[256];
strcpy( file_name, p_filename );

//ファイル名表示

printf( "%s", file_name );

//コピーする必要がなければこれでもよし

printf( "%s", p_filename );
SearchPath() 関数で最初に C:\Program Files フォルダを調べて欲しい時は

SearchPath( "C:\\Program Files", 以下略・・・ );
最初の引数に "C:\\Program Files" を指定します。

| home |