山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他ファイル名からフルパスを取得する
概要
GetFullPathName APIを使用し、ファイル名の絶対パスを取得します。 サンプルは、コマンドラインで動作するプログラムで引数にファイル名を指定すると、絶対パスとファイル名を表示します。 この関数が便利なところはフォルダーの区切りに通常の¥のほかにhtmlファイルで使用されている/も使用できます。 もちろん カレントフォルダーを示す.や親フォルダーを示す..、イントラネットで使う¥¥も正常に動作します。 Unicodeの場合、Windowsのコマンドプロンプト上の出力はマルチバイトでしか漢字が正常に表示されないため、_tsetlocale関数でロケールを指定します。
テスト環境
コンパイラ
Visual C++ 2008 Standard 32/64bitVisual C++ 2013 Express 32/64bit
プロジェクトの作成
Win32コンソールアプリケーション実行環境
Windows 8.1 Enterprise 64bitWindows 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);
}
ソースファイルのダウンロード
Copyright (C) 2012 山本ワールド All Rights Reserved.