概要

GetFullPathName APIを使用し、ファイル名の絶対パスを取得します。 サンプルは、コマンドラインで動作するプログラムで引数にファイル名を指定すると、絶対パスとファイル名を表示します。 この関数が便利なところはフォルダーの区切りに通常の¥のほかにhtmlファイルで使用されている/も使用できます。 もちろん カレントフォルダーを示す.や親フォルダーを示す..、イントラネットで使う¥¥も正常に動作します。 Unicodeの場合、Windowsのコマンドプロンプト上の出力はマルチバイトでしか漢字が正常に表示されないため、_tsetlocale関数でロケールを指定します。

テスト環境

コンパイラ

Visual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit

プロジェクトの作成

Win32コンソールアプリケーション

実行環境

Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit

プログラムソースの概要

_tmain関数

_tsetlocale関数によりUNICODE文字を標準出力に正しく表示させるためにロケールを設定します。
GetFullPathName APIにコマンドラインの引数とフルパスが保存されるバッファとバッファサイズを渡します。
GetFullPathName APIの戻り値は、UNICODE版の場合文字数、マルチバイト版の場合バイト数が返されます。
バッファサイズより戻り値の方が大きい場合は、バッファサイズが不足していたことを示します。
バッファとバッファサイズを0にしてGetFullPathName APIを呼び出して必要なバッファサイズを取得し、 動的にバッファを確保し、確保されたバッファを使用してGetFullPathName APIを呼び出せばバッファサイズ不足を防ぐことができます。
このAPIはファイル・フォルダの存在の確認はしません。
以下にコマンドプロンプトでの動作例を示します。
E:¥test>fullpath chk.txt
フルパス        E:¥test¥chk.txt
ファイル        chk.txt

E:¥test>fullpath ¥¥testserver¥test¥chk.txt
フルパス        ¥¥testserver¥test¥chk.txt
ファイル        chk.txt

E:¥test>fullpath ..¥*.*
フルパス        E:¥*.*
ファイル        *.*

E:¥test>fullpath ../*.*
フルパス        E:¥*.*
ファイル        *.*

E:¥test>fullpath ./*.*
フルパス        E:¥test¥*.*
ファイル        *.*
E:¥test>fullpath ../test
フルパス        E:¥test
ファイル        test

E:¥test>fullpath ..¥
フルパス        E:¥
ファイル        (null)

E:¥test>fullpath .
フルパス        E:¥test
ファイル        test

E:¥test>fullpath e:
フルパス        E:¥test
ファイル        test

プログラムソース

//       引数で指定されたファイル名をフルパスに変換して出力する。
//      Visual C++ 2013 32/64bit

#include <windows.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>

int _tmain(int argc,TCHAR** argv){
        //      UNICODE文字を標準出力に正しく表示させるためにロケールを設定
        _tsetlocale(LC_ALL, _TEXT(""));
        TCHAR FullPath[MAX_PATH];
        TCHAR* FilePart;
        DWORD sz;
        sz=GetFullPathName(argv[1],sizeof(FullPath)/sizeof(TCHAR),FullPath,&FilePart);
        if( sizeof(FullPath)/sizeof(TCHAR) < sz )
                _tprintf(_TEXT("バッファの文字数が足りません %d以上必要¥n"),sz);
        else
                _tprintf(_TEXT("フルパス¥t%s¥nファイル¥t%s¥n"),FullPath,FilePart);

}

ソースファイルのダウンロード

ダウンロード fullpath.zip(52.4kByte)
ZIPファイルに含まれるファイル
fullpath.cpp
fullpath.exe