Archive for 2012年12月|Monthly archive page
newLISPでショートパス名を扱う...Windows専用
現在のWindowsは平気で長いパス名が使えますが、DOS 時代は、8文字+ピリオド+拡張子3文字の12文字でした。今でも、ショートパス名として使え、コマンド・プロンプトで dir /x と打てば、実際にショートパス名を見ることができます。
さて、newLISP でショートパス名を取得するには、WINAPI GetShortPathName を使います。
使い方はこんな感じ、
> (import "kernel32.dll" "GetShortPathNameA")
GetShortPathNameA@770D9CEE
> (setq l_rtnStr 20 rtnStr (dup "\000" (+ 1 l_rtnStr)))
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
> (GetShortPathNameA {c:\Program Files} rtnStr l_rtnStr)
11
> (string rtnStr)
"c:\\PROGRA~1"
> (GetShortPathNameA {c:\temp} rtnStr l_rtnStr)
7
> (string rtnStr)
"c:\\temp"
> rtnStr
"c:\\temp\000A~1\000\000\000\000\000\000\000\000\000\000"
>
組込string を使っているのは、"\000" 以降の余分な文字列を除くため。
さて、これをどんな時に使うかというと、前に紹介した Windows API を使った音楽ファイルを再生するスクリプト。
ここで使っているWinAPI mciSendString は、ファイル名が長すぎるとエラーを起こします。
そこで、このショートパス名が生きてくるのです。
(define l_shortPath 67)
(define shortPath (dup "\000" (+ 1 l_shortPath)))
(define (music:open_s m)
(GetShortPathNameA m shortPath l_shortPath) (setq m (string shortPath))
(mciSendStringA (string "open \"" m "\" alias" alias-name) 0 0 0))
前回のスクリプトに、これを追加するだけ。使い方は、こちらを見て下さい。
music:open の代わりに、music:open_s を使って音楽ファイルを開くだけで、後は一緒です。
タイトルにある通り、Windows専用です。
ローカル・ドライブなら問題無いと思いますが、ネットワーク・ドライブの中にはショートパスをサポートしていなものありますので、注意が必要です。
以上、如何でしょうか?