GetFullPathName ファイル名の補完

Cの宣言:

DWORD GetFullPathName(
	LPCTSTR FileName,
	DWORD PathNameSize,
	LPTSTR PathName,
	LPTSTR *FilePart);

ファイル名部分の参照を必要としない場合のVBの宣言:

Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" ( _
	ByVal FileName As String, _
	ByVal PathNameSize As Long, _
	ByVal PathName As String, _
	ByVal FilePart As Long) As Long

ファイル名部分の参照を必要とする場合のVBの宣言:

Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" ( _
	ByVal FileName As String, _
	ByVal PathNameSize As Long, _
	ByVal PathName As Long, _
	ByRef FilePart As Long) As Long

説明:

カレントディレクトリと与えられたファイル名を結合し、フルパス名を生成する。

与えられたファイル名は実際にカレントディレクトリに存在する必要はない。ファイル名として正しい形式である必要も無い。例えば、ファイル名として“<|>*”などという文字列を指定しても、エラーは発生しない。

FileNameに、正しいフォーマットのパス形式を指定した場合、PathNameには適切なフルパス名が返される。パス形式が絶対パス指定ならばカレントディレクトリはとの結合は行わず、総体パス指定ならば、カレントディレクトリを加味した形式の絶対パスが返される。

引数の意味は、以下の通り。
FileName (IN) ファイル名。
PathNameSize (IN) 生成したフルパス名を保存するバッファのサイズ。
PathName (OUT) 生成したフルパス名を保存するバッファ。
FilePart (OUT) 生成したフルパス名のうちファイル名部分へのポインタ。NULLを指定した場合、無視される。

戻り値は、フルパス名の文字数である。バッファが小さすぎる場合は、必要なバッファのサイズを返す。関数の実行に失敗したならば、0が返される。

Cのサンプル:

/* aaa.txtがカレントディレクトリにあるものと仮定してフルパス名に変換する。
void DispFullPathName()
{
	char *fname = "aaa.txt";
	char buf[1000], *s;

	GetFullPathName(fname, 1000, buf, &s);

	printf("full path name:%s; file name:%s\n", buf, s);
}

ファイル名部分の参照を必要としない場合のVBのサンプル:

'宣言
Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" ( _
	ByVal FileName As String, _
	ByVal PathNameSize As Long, _
	ByVal PathName As String, _
	ByVal FilePart As Long) As Long

'フルパス名の取得
Private Sub DispFullPathName()
	Dim PathName As String * MAX_PATH

	GetFullPathName ".\qq\aaa.txt", MAX_PATH, PathName, 0
	MsgBox Left(PathName, InStr(PathName, vbNullChar) - 1)
End Sub

ファイル名部分の参照を必要とする場合のVBのサンプル:

'主な宣言
Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" ( _
	ByVal FileName As String, _
	ByVal PathNameSize As Long, _
	ByVal PathName As Long, _
	ByRef FilePart As Long) As Long

Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" ( _
	ByVal Dest As String, ByVal pSrc As Long) As Long

' フルパス名とファイル名部分表示
Private Sub DispFullPathName()
	Dim pPathName As Long
	Dim pFilePart As Long
	Dim PathName As String * MAX_PATH
	Dim FilePart As String * MAX_PATH

	'フルパス名用バッファ割り当て
	pPathName = GlobalAlloc(GMEM_FIXED, MAX_PATH)

	'フルパス名取得
	GetFullPathName "aaa.txt", MAX_PATH, pPathName, pFilePart

	'ポインタを文字列に変換
	PtrToStr PathName, pPathName
	PtrToStr FilePart, pFilePart

	'表示
	MsgBox "パス:" & Left(PathName, InStr(PathName, vbNullChar) - 1) & vbCr & _
		"ファイル名部分:" & Left(FilePart, InStr(FilePart, vbNullChar) - 1)

	'フルパス用バッファ開放
	GlobalFree pPathName
End Sub
(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。