From time to time I write VBA. One of the things I have needed is what is called the short path. If you ever worked at the command line, it looks like what is shown below. “PROGRA~1” is the short name for “Program Files”.
C:\>dir /x *
Directory of C:\
01/20/2020 04:09 PM <DIR> PROGRA~1 Program Files
01/22/2020 02:05 AM <DIR> PROGRA~2 Program Files (x86)
11/24/2019 12:07 AM <DIR> SOLIDW~1 SOLIDWORKS Data
11/23/2019 10:26 PM <DIR> Users
01/10/2020 07:41 AM <DIR> Windows
0 File(s) 0 bytes
10 Dir(s) 347,556,667,392 bytes freeShort names can be useful when processing file names that are hard to parse. For instance, dumping a file list to a Comma Separated Values file. If one of the paths has a comma, that path will get separated into separate values. One way to deal with this is to just put the path in quotes like this C:\my path\ with a, comma\folder The other way to deal with this just store the short path/name. Usually, when I have used the short name, I have needed it in Excel. Therefore, I have a couple of functions written VBA that I use. They are shown below. One of them returns the short name and the other returns the long name.
Option Explicit
' Max length of a long path
Private Const MAX_PATH = 32768
' Declarations hooking into Windows API
Private Declare Function GetLongPathNameW Lib "kernel32" (ByVal lpszShortPath As Long, ByVal lpszLongPath As Any, ByVal cchBuffer As Long) As Long
Private Declare Function GetShortPathNameW Lib "kernel32" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Any, ByVal cchBuffer As Long) As Long
Public Function GetLongPathName(strShortPath As String) As String
Dim strLongPath As String * MAX_PATH
Dim lLongPathLength As Long
' Call WIndows API for long path in Unicode
lLongPathLength = GetLongPathNameW(StrPtr(strShortPath), strLongPath, MAX_PATH)
' Handle Any errors before returning
If lLongPathLength = 0 Then
GetLongPathName = CVErr(xlErrValue)
Else
'Convert string and discard extra characters
GetLongPathName = Left$(StrConv(strLongPath, vbFromUnicode), lLongPathLength)
End If
End Function
Public Function GetShortName(ByVal strLongPath As String) As String
Dim strShortPath As String * MAX_PATH
Dim lShortPathLength As Long
' Call Windows API for short path in Unicode
' \\?\ must be prepended because this will allow for paths longer than 260 characters
lShortPathLength = GetShortPathNameW(StrPtr("\\?\" & strLongPath), strShortPath, MAX_PATH)
' Handle Any errors before returning
If lShortPathLength = 0 Then
GetShortName = CVErr(xlErrValue)
Else
'Convert string and discard extra characters
GetShortName = Mid$(StrConv(strShortPath, vbFromUnicode), 5, lShortPathLength - 4)
End If
End Function