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専用です。
 ローカル・ドライブなら問題無いと思いますが、ネットワーク・ドライブの中にはショートパスをサポートしていなものありますので、注意が必要です。

 以上、如何でしょうか?