The functions fGetShortName and fGetLongName will return the
appropriate filename for you.
Private Const MAX_PATH& = 260
Private Const INVALID_HANDLE_VALUE = -1
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved¯ As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private Declare Function apiFindFirstFile Lib "kernel32" _
Alias "FindFirstFileA" _
(ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) _
As Long
Private Declare Function apiFindClose Lib "kernel32" _
Alias "FindClose" _
(ByVal hFindFile As Long) _
As Long
Private Declare Function apiGetShortPathName Lib "kernel32" _
Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) _
As Long
Function fGetShortName(ByVal stLongPath As String) As String
Dim stShortPath As String
Dim lngBuffer As Long, lngRet As Long
stShortPath = String$(MAX_PATH, 0)
lngBuffer = Len(stShortPath)
lngRet = apiGetShortPathName(stLongPath, stShortPath, lngBuffer)
fGetShortName = Left(stShortPath, lngRet)
End Function
Function fGetLongName(ByVal strFileName As String) As String
Dim lpFindFileData As WIN32_FIND_DATA
Dim strPath As String, lngRet As Long
Dim strFile As String, lngX As Long, lngY As Long
Dim strTmp As String
strTmp = ""
Do While Not lngRet = INVALID_HANDLE_VALUE
lngRet = apiFindFirstFile(strFileName, lpFindFileData)
strFile = Left$(lpFindFileData.cFileName, _
InStr(lpFindFileData.cFileName, _
vbNullChar) - 1)
If Len(strFileName) > 2 Then
strTmp = strFile & "\" & strTmp
strFileName = fParseDir(strFileName)
Else
strTmp = strFileName & "\" & strTmp
Exit Do
End If
Loop
fGetLongName = Left$(strTmp, Len(strTmp) - 1)
lngY = apiFindClose(lngRet)
End Function
Private Function fParseDir(strInFile As String) As String
Dim intLen As Long, boolFound As Boolean
Dim i As Integer, f As String, strDir As String
intLen = Len(strInFile)
If intLen > 0 Then
boolFound = False
For i = intLen To 1 Step -1
If Mid$(strInFile, i, 1) = "\" Then
f = Mid$(strInFile, i + 1)
strDir = Left$(strInFile, i - 1)
boolFound = True
Exit For
End If
Next i
End If
If boolFound Then
fParseDir = strDir
Else
fParseDir = strInFile
End If
End Function
|