〜 ファイル 〜
[..\]や[.\]を含んだパスを元に戻す (要SHLWAPI.DLL)

相対パス指定時に同階層を示す「.」や1つ上の階層を示す「..」が良く使用されますが、
文字列内にコレらが含まれたままフォルダやファイルのパスとして指定されても認識されません。
この「.」や「..」を取り除いて、認識されるパス文字列に直すAPI関数PathCanonicalizeを紹介します。
API関数PathCanonicalizeは「.」の除去、「..」の1階層分除去の他、
ルート(最上階層)より上の階層にならないよう「..」は無視されるようにもなっています。
あくまで「.」「..」を除去するだけであり、そのパスが正しいか否かは判断されません。
API関数を使わずとも自力で編集できる程度の機能ですが参考として載せておきます。
	

canonicalize 正規化後, 正規化前
正規化後正規化後のパス文字列を格納する変数を指定する。
正規化前正規化対象パス文字列を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
	ll_libload shlwapi, "shlwapi.dll"
	ll_getproc PathCanonicalize, "PathCanonicalizeA", shlwapi

#module
#deffunc canonicalize val, str
	mref after, 24 : mref before, 33
	sdim s, 256
	ll_getptr s : ll_ret prm.0
	ll_getptr before : ll_ret prm.1
	ll_callfunc prm, 2, PathCanonicalize@
	after = s
	return
#global

	sdim file, 256
	file = "c:\\windows\\.\\system\\..\\explorer.exe"
	font "", 20, 1
	objsize 150, 30 : objmode 2
	input file, 480, 25
	button "元の形に戻す", *canon
	stop

*canon
	canonicalize file, file
	objprm 0, file
	stop

正規化後 = canonicalize(正規化前)
正規化後正規化後のパス文字列の受取先を指定する。
正規化前正規化対象パス文字列を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#uselib "shlwapi.dll"
#func  global PathCanonicalize "PathCanonicalizeA" var, sptr

#module
#defcfunc canonicalize str path, local s
	sdim s, 256
	PathCanonicalize s, path
	return s
#global

	file = "c:\\windows\\.\\system\\..\\explorer.exe"
	font "", 20, 1
	objsize 150, 30 : objmode 2
	input file, 480, 25
	button gosub "元の形に戻す", *canon
	stop

*canon
	objprm 0, canonicalize(file)
	return