SearchPath 特定のディレクトリからファイルを検索

Cの宣言:

DWORD SearchPath(
	LPCTSTR PathName,
	LPCTSTR TargetFileName,
	LPCTSTR TargetFileExt,
	DWORD ResultFileNameSize,
	LPTSTR ResultFileName,
	LPTSTR *FilePart);

検索結果を文字列変数で受け取る場合のVBの宣言:

Declare Function SearchPath Lib "kernel32" Alias "SearchPathA" ( _
	ByVal PathName As String, _
	ByVal TargetFileName As String, _
	ByVal TargetFileExt As String, _
	ByVal ResultFileNameSize As Long, _
	ByVal ResultFileName As String, _
	ByRef FilePart As Long) As Long

検索結果のバッファをポインタで指定する場合のVBの宣言:

Declare Function SearchPath Lib "kernel32" Alias "SearchPathA" ( _
	ByVal PathName As String, _
	ByVal TargetFileName As String, _
	ByVal TargetFileExt As String, _
	ByVal ResultFileNameSize As Long, _
	ByVal ResultFileName As Long, _
	ByRef FilePart As Long) As Long

説明:

PathNameで指定したディレクトリ、または定められたディレクトリからTargetFileNameで与えられた文字列と名前が一致するファイル/ディレクトリを検索する。

PathNameには、“;”で区切った複数のディレクトリ名を記述することができる。

PathNameがNULLの場合、起動時ディレクトリ→カレントディレクトリ→システムディレクトリ→16ビットWindowsシステムディレクトリ(NT)→Windowsディレクトリ→環境変数pathに指定されたディレクトリ、の順で検索を行う。

検索するファイルの名前には、“dir1\dir2\filename”などという指定も可能である。

任意のディレクトリツリーを検索したい場合は、FindXXXFile系関数を再帰的に使用するか、SearchTreeForFileを使用する。

引数の意味は、以下の通り。
PathName (IN) 検索するパス。NULLならば、既定のディレクトリが検索される。
TargetFileName (IN) 検索するファイル名。
TargetFileExt (IN) 検索するファイルの拡張子。不要であったり、TargetFileNameで既に拡張子を指定している場合はNULLでかまわない。
ResultFileNameSize (IN) 検索結果のパス名を保存するバッファのサイズ
ResultFileName (OUT) 検索結果のパス名を保存するバッファ
FilePart (OUT) 検索結果のパス名中の末尾のファイル名へのポインタ

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

Cのサンプル:

void DoSearchPath()
{
	char buf[1000], *s;
	
	SearchPath(
		"d:\\;d:\\doc;",
		"aaa.txt",
		NULL,
		1000,
		buf,
		&s);

	printf("%s; %s\n", buf, s);
}

ファイル名部分を参照しないVBのサンプル:

'主な宣言
Declare Function SearchPath Lib "kernel32" Alias "SearchPathA" ( _
	ByVal PathName As String, _
	ByVal TargetFileName As String, _
	ByVal TargetFileExt As String, _
	ByVal ResultFileNameSize As Long, _
	ByVal ResultFileName As String, _
	ByRef FilePart As Long) As Long

' ファイルの検索
Private Sub DoSearchPath()
	Dim ResultFileName As String * 1000
	Dim pFilePart As Long

	'ファイルの検索
	SearchPath _
		"c:\;c:\windows", _
		"notepad.exe", _
		vbNullString, _
		1000, _
		ResultFileName, _
		pFilePart

	'結果の表示
	MsgBox "検索結果:" & Left(ResultFileName, InStr(ResultFileName, vbNullChar) - 1)
End Sub

ファイル名部分を参照するVBのサンプル:

'主な宣言
Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" (ByVal Dest As String, ByVal pSrc As Long) As Long

Declare Function SearchPath Lib "kernel32" Alias "SearchPathA" ( _
	ByVal PathName As String, _
	ByVal TargetFileName As String, _
	ByVal TargetFileExt As String, _
	ByVal ResultFileNameSize As Long, _
	ByVal ResultFileName As Long, _
	ByRef FilePart As Long) As Long

'ファイルの検索
Private Sub DoSearchPath()
	Dim pResultPath As Long
	Dim pFilePart As Long
	Dim Msg As String
	Dim ResultPath As String * 1000
	Dim FilePart As String * 1000

	'初期化
	pResultPath = GlobalAlloc(GMEM_FIXED, 1000)

	'ファイルの検索
		SearchPath _
		"a:\;a:\windows", _
		"notepad.exe", _
		vbNullString, _
		1000, _
		pResultPath, _
		pFilePart

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

	'メッセージの作成
	Msg = "検索結果:" & Left(ResultPath, InStr(ResultPath, vbNullChar) - 1) & vbCr
	Msg = Msg & "ファイル名部分:" & Left(FilePart, InStr(FilePart, vbNullChar) - 1)

	'メッセージの表示
	MsgBox Msg

	'後処理
	GlobalFree pResultPath
End Sub

メモ:

VBでバイト配列を文字列に変換する方法は?
(original text:1998/12/25 更新)

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