Shell-03 長いファイル名を短いファイル名(DOS時代の8+3形式)に変換する

Q 長いファイル名を短いファイル名(DOS時代の8+3形式)に変換したり、またはその逆がしたいのですが、どうしましょう…。
A GetShortPathName・GetLongPathName関数を使います。
どう使う?
長いファイル名を短いファイル名に変換
Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
(lpszLongPath As String,lpszShortPath As String,cchBuffer As Long) _
As Long

Dim
Buf As String

Buf=ZeroString(MAX_PATH)
GetShortPathName("C:\Program Files\ActiveBasic\ProjectEditor.exe",Buf,MAX_PATH)
Buf=MakeStr(Buf)
短いファイル名を長いファイル名に変換
Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameA" _
(lpszShortPath As String,lpszLongPath As String,cchBuffer As Long) _
As Long

Dim
Buf As String

Buf=ZeroString(MAX_PATH)
GetLongPathName("C:\PROGRA~1\ACTIVE~1\PROJEC~1.EXE",Buf,MAX_PATH)
Buf=MakeStr(Buf)
8+3形式とは、ファイル名を全て大文字で記述し、拡張子を除いたフォルダ名・ファイル名が8バイトを超える場合には、その先頭6バイトを取って、「~1」「~2」などのID(?)をつけ、拡張子も3文字に切り詰めるものです。
このとき先頭6バイトが全く同じになることがあるので「~1」「~2」を足すことが必要になるんです。
(例)「Microsoft Office」と「Microsoft Visual Studio」など

C:\Program Files\ActiveBasic\ProjectEditor.exe
C:\PROGRA~1     \ACTIVE~1   \PROJEC~1     .EXE

という感じになります(位置を合わせるためスペースを入れていますが、実際にはスペースは入りません)。
なお、GetLongPathNameでは短いパスを小文字で記述しようが、大文字で記述しようが、正しく変換されるようになっています。

メニューに戻る