Find That Long Pathname

This tip allows Visual Basic programmers to find a full pathname given the file name.

This Content Component encountered an error
Find That Long Pathname

File names can be a bear, especially when you need to know a full file name or path, and all you have is the file specification in the old style 8.3 format. Reader David Goben offers this tip, which allows you to find a full pathname given the file name.

A lot has been said about the GetShortPathname() API call, but I have not seen anything regarding obtaining the long path name, which is something we require at my company. So I'm submitting the following module code which will support this. It takes advantage of the GetLongPathName() API available to Win98/Me/2000, but this code will also support NT4.0/Win95 if this API is not available:

 
Option Explicit
'~modGetLongPath.bas;
'Return the longpath of a shortpath specification
'**************************************************************************
' modGetLongPath - The GetLongPath() function returns the longpath version 
of a
'                  filepath or dirpath that is formatted in the 8.3 
shortpath
'                  format.
'EXAMPLE:
'  Debug.Print GetLongPath("C:Progra~1Common~1micros~1webser~1")
''' This will print:
''' C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions
'
'NOTE: This module requires a reference to Microsoft Scripting Runtime 
(Scrrun.dll)
'**************************************************************************

 
Private Declare Function GetLongPathName Lib "kernel32" Alias 
"GetLongPathNameA" _
       (ByVal lpszLongPath As String, _
        ByVal lpszLongPath As String, _
        ByVal cchBuffer As Long) As Long
 
Public Function GetLongPath(InPath As String) As String
  Dim fso As FileSystemObject, fold As Folder, fil As File
  Dim S As String, I As Integer, j As Integer, drv As String, tmp As String
  Dim SS As String
  
  S = Trim$(InPath)                                 'get the trimmed form 
of path
  drv = String(260, 0)                              'receiving buffer
  On Error Resume Next
  I = GetLongPathName(S, drv, 260)                  'get buffer to drv, len 
to I
  If Err.Number = 0 Then                            'not win98/ME/2000
    GetLongPath = Left$(drv, I)                     'return path if no 
error
    Exit Function
  End If
  On Error GoTo 0
'
' win Nt4.0/95 or below, so do it with an FSO
'
  drv = ""                                          'blank in case not 
existing
  If Len(Dir(S)) Or Len(Dir(S, vbDirectory)) Then   'file/dir exists
    drv = S                                         'init to full path
'
' check for short stuff existing
'
    If InStr(1, S, "~") Then                        'short stuff in there?
      drv = ""                                      'yes, so yank sort path
      Set fso = New FileSystemObject                'set up pathing object
      If Left$(S, 2) = "" Then                    'UNC path?
        I = InStr(3, S, "")                        'yes, skip device name
        If I Then
          j = InStr(I + 1, S, "")                  'then skip drive name
          If j Then I = j
        End If
      Else
        I = InStr(3, S, "")                        'else just skip drive
      End If
      If I Then                                     'drivepath specified?
        drv = Left$(S, I)                           'get drive
        S = Mid$(S, I + 1)                          'get stuff after
      End If
'
' step through directory data
'
      I = InStr(I + 1, S, "")                      'a subdir path?
      Do While I
        tmp = LCase$(Left$(S, I - 1))               'yes, get subdir name
        j = InStr(tmp, "~")                         'short name?
        If j Then                                   'yes, find full name
          SS = Dir(drv & Left$(tmp, j - 1) & "*", vbDirectory)
          Do While Len(SS)
            Set fold = fso.GetFolder(drv & SS)      'get folder for long 
path
            If LCase$(fold.ShortName) = tmp Then Exit Do  'found short 
version
            SS = Dir()                              'else get next
          Loop
        Else
          SS = tmp                                  'not short, so keep 
full name
        End If
        drv = drv & SS & ""                        'set new base path
        S = Mid$(S, I + 1)                          'trimp off prev dir
        I = InStr(1, S, "")                        'check for another
      Loop
'
' handle stuff left over
'
      If Len(S) Then
        j = InStr(1, S, "~")                        'last item short?
        If j Then                                   'yes
          SS = Dir(drv & Left$(S, j - 1) & "*", vbDirectory)
          If Len(SS) Then                           'was a directory
            Do While Len(SS)                        'get full path
              Set fold = fso.GetFolder(drv & SS)
              If LCase$(fold.ShortName) = S Then Exit Do
              SS = Dir()                            'never blank unless 
it's a file
            Loop
          End If
          If Len(SS) = 0 Then                       'file?
            SS = Dir(drv & Left$(S, j - 1) & "*")   'yes, check matching 
files
            Do While Len(SS)
              Set fil = fso.GetFile(drv & SS)       'check for matching 
shortname
              If LCase$(fil.ShortName) = S Then Exit Do
              SS = Dir()                            'else check next
            Loop
          End If
        Else
          SS = S                                    'keep full name if noth 
short
        End If
      End If
      If Len(SS) Then drv = drv & SS                'build full long path
      Set fso = Nothing                             'remove object
    End If
  End If
  GetLongPath = drv                                 'return result
End Function

Thanks, David. As a token of our appreciation, we will be sending you a SearchVB denim shirt.

David Goben is lead developer for Merry Mechanization, Inc.'s Advanced Development Group. He have been programming since 1978, first in Assembler, then Fortran, C, Forth, Pascal, and finally BASIC. He has used VB since Version 1.0.


This was first published in November 2000

Dig deeper on Win Development Resources

1 comment

Oldest 

Forgot Password?

No problem! Submit your e-mail address below. We'll send you an email containing your password.

Your password has been sent to:

-ADS BY GOOGLE

SearchCloudComputing

SearchSoftwareQuality

SearchSOA

TheServerSide

SearchCloudApplications

Close