● 短いファイル名を長いファイル名に変換する ●

Windows 95 では、実行ファイルにファイルがドラッグされた際、コマンドラインから受け取るファイル名は短いファイルであった。

以下はマイクロソフトのページに載ってたロジック。現在もあるかは不明。

'----------------------------------------------------------------
'  関数名 : CnvShortToLong
'  機能   : 短いファイル名を長いファイル名に変換する
'  引数   : (in) ShortFileName … ファイルの短いファイル名
'  戻り値 : 変換された長いファイル名
'----------------------------------------------------------------
Public Function CnvShortToLong(ByVal ShortFileName As String) As String

    Dim LongFileName As String
    Dim TempBuff As String
    Dim SparatorPos As Long

    'Instr関数がエラーにならないように文字列の最後に "\" を付ける
    ShortFileName = ShortFileName & "\"

    'ドライブ名は無視して4文字目から開始
    SparatorPos = InStr(4, ShortFileName, "\")

    '\ 記号間の文字列を取り出す
    While SparatorPos
        TempBuff = Dir$(Left$(ShortFileName, SparatorPos - 1), _
                  vbNormal + vbHidden + vbSystem + vbDirectory)

        If TempBuff = "" Then Exit Function
        LongFileName = LongFileName & "\" & TempBuff
        SparatorPos = InStr(SparatorPos + 1, ShortFileName, "\")
    Wend

    'ドライブ名を付けて返す
    CnvShortToLong = Left$(ShortFileName, 2) & LongFileName

End Function


次は VB に付属しているかもしれない DLL を使用する方法。まったくもっておすすめできない。

'VB4.0
Private Declare Function GetLongPathName Lib "STKIT432.DLL" (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

'VB5.0
Private Declare Function GetLongPathName Lib "VB5STKIT.DLL" (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

'VB6.0 → GetLongPathName() は無いので使用不可!! や〜いや〜い
'Private Declare Function GetLongPathName Lib "VB6STKIT.DLL" (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

'----------------------------------------------------------------
'  関数名 : CnvShortToLong
'  機能   : 短いファイル名を長いファイル名に変換する
'  引数   : (in) ShortFileName … ファイルの短いファイル名
'  戻り値 : 変換された長いファイル名
'  備考   : STKIT432.DLL はWindowsのシステムDllではないので注意
'----------------------------------------------------------------
Public Function CnvShortToLong(ByVal ShortFileName As String) As String

    Dim TempBuff As String * 256

    Call GetLongPathName(ShortFileName, TempBuff, Len(TempBuff))

    CnvShortToLong = Left$(TempBuff, InStr(TempBuff, Chr$(0)) - 1)

End Function

戻る