〜 ファイル 〜
ロングパスネームをショートパスネームに変換 (要KERNEL32.DLL)

Windows9X時代だと、まだ普通に聞くことがあったDOSショートパスネームという言葉。
フォルダやファイル名を8文字以内、拡張子を3文字以内にして表す様子から8.3形式と呼ばれ、
9文字以上ある場合は、前半の6文字と半角チルダと1から始まる重複しない番号が自動的に割り振られます。
内部には別名としてショートパスを持ってはいるもののエクスプローラ上からは見ることができず、
利用する側から考えるとわかりにくいだけの機能である気がします。
また、今やパソコンの搭載メモリやハードディスク等々のあらゆるものが大容量化して、
ショートファイルネームを使う必要性もなくなったので、情報として載せておく価値はないかもしれません。
ショートパスへの変換のためだけにHspext.dllを使うのはイヤという場合もあるでしょうから、
参考用としての意味も含めて載せておきます。

Hspext.dllfxshort命令の元となるAPI関数GetShortPathNameを使います。
引数に指定するのは、変換元のパス名、8.3形式に変換したパス名の受取先、受取先変数サイズで、
変換元のパス名の一部または全部が予めショートパスになっていても問題ありません。
詳しい設定方法については下記のサンプルモジュールを参照してください。
尚、ショートパスからロングパスへはAPI関数GetLongPathNameで変換することができますが、
標準命令のdirlist命令でも変換できるのでAPIを使っての変換は紹介しません。
	

getshortpath 受取先変数, 変換元パス, サイズ
受取先変数ショートパスネームの受取先文字列型変数を指定する。
変換元パス変換対象の文字列またはパスを格納した文字列型変数を指定する。
サイズ受取先変数のサイズを指定する。
省略した場合、64バイトとなるので半角63文字分までしか受け取られないので注意すること。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
	ll_libload kernel, "kernel32.dll"
	ll_getproc GetShortPathName, "GetShortPathNameA", kernel

#module
#deffunc getshortpath val, str, int
	mref shortname, 24 : mref longname, 33 : mref size, 2
	ll_getptr longname : ll_ret prm.0
	ll_getptr shortname : ll_ret prm.1
	prm.2 = (size = 0) * 64 + size
	ll_callfunc prm, 3, GetShortPathName@
	return
#global

	sdim file, 260
	dialog "", 16
	if stat = 0 : end
	getshortpath file, refstr
	mes refstr + "\n\nのショートネームは\n\n" + file + "\n\nです"
	stop

ショートパス = getshortpath(変換元パス)
ショートパスショートパスネームの受取先を指定する。
変換元パス変換対象の文字列またはパスを格納した文字列型変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#uselib "kernel32.dll"
#func  global GetShortPathName "GetShortPathNameA" str, var, int

#module
#defcfunc getshortpath str longname, local s
	sdim s, 260
	GetShortPathName longname, s, 260
	return s
#global

	file = strf("%s\\common\\hsp261cmp.as", dir_exe)
	mes strf("%s\n\nのショートネームは\n\n%s\n\nです", file, getshortpath(file))