Visual Basic File API Routines

FindFirstFile: An API 'FolderExists' Routine
     
Posted:   Wednesday October 20, 1999
Updated:   Monday December 26, 2011
     
Applies to:   VB4-32, VB5, VB6
Developed with:   VB6, Windows NT4
OS restrictions:   None
Author:   VBnet - Randy Birch
     

Related:  

 

FindFirstFile: Changing File and/or Folder Attributes Recursively
FindFirstFile: Fast Directory File Count

FindFirstFile: Extract Filename from a Full Path
FindFirstFile: Performance Comparison - FSO vs. API
FindFirstFile: Comparison of FindFirstFile and SearchTreeForFile
FindFirstFile: Save a Recursive Search of All Drives to Disk
FindFirstFile: Save a Recursive Search of Specified Drives to Disk
GetFileVersionInfo: File Search and File Property Info
GetLogicalDriveStrings: An API 'DriveExists' Routine
FindFirstFile: An API 'FileExists' Routine
FindFirstFile: An API 'FolderExists' Routine
PathFileExists: A Local/Network File/Folder/Drive Exists Routine
     
 Prerequisites
None.

I don't like Dir(), so I tend to use this routine instead to determine if a specified folder is valid. Like the FileExists and DriveExists functions, this also simply returns True or False.

The method calls FindFirstFile passing the folder of interest. If the result of the call, the Find handle, is not invalid, and the returned WIN32_FIND_DATA dwAttributes member contains the FILE_ATTRIBUTE_DIRECTORY flag, then the folder exists.

This method also works against UNC drives. If a remote machine's drive is mapped to a share, e.g. drive C is mapped to the share named 'drivec', then the function will return true if a subfolder under C is specified, e.g. \\remotepc\drivec\windows\ or \\remotepc\drivec\windows\system32\drivers\etc\.

Similarly if an admin share is specified the function returns True for folders under the admin share, e.g. \\remotepc\C$\windows\ or \\remotepc\c$\windows\system32\drivers\etc\.

If \\remotepc\drivec\ alone is passed, the function returns False as drivec is not a folder, but a drive. This can also be used when utilizing UNC paths to relate to shares on the local machine.

Remember that C:\, D:\ etc. are not folders but root drives, so this code will return false. To test for root drives, use the DriveExists method under Related Items above.

 BAS Module Code
None.

 Form Code
Drop a text box, label and command button onto a form, and add the following:

Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright 1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
'               applications, but you may not reproduce 
'               or publish this code on any web site,
'               online service, or distribute as source 
'               on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Const MAX_PATH As Long = 260
Private Const INVALID_HANDLE_VALUE As Long = -1
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10
 
Private Type FILETIME
   dwLowDateTime As Long
   dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
   dwFileAttributes As Long
   ftCreationTime As FILETIME
   ftLastAccessTime As FILETIME
   ftLastWriteTime As FILETIME
   nFileSizeHigh As Long
   nFileSizeLow As Long
   dwReserved0 As Long
   dwReserved1 As Long
   cFileName As String * MAX_PATH
   cAlternate As String * 14
End Type

Private Declare Function FindFirstFile Lib "kernel32" _
   Alias "FindFirstFileA" _
  (ByVal lpFileName As String, _
   lpFindFileData As WIN32_FIND_DATA) As Long
   

Private Declare Function FindClose Lib "kernel32" _
  (ByVal hFindFile As Long) As Long


Private Sub Command1_Click()

  'pass the text to the FolderExists
  'routine, returning the result to a label.
   If Len(Text1.Text) > 0 Then
   
      Label1.Caption = FolderExists(Text1.Text)
      
   End If
   
End Sub


Private Function FolderExists(sFolder As String) As Boolean

   Dim hFile As Long
   Dim WFD As WIN32_FIND_DATA
   
  'remove training slash before verifying
   sFolder = UnQualifyPath(sFolder)

  'call the API pasing the folder
   hFile = FindFirstFile(sFolder, WFD)
   
  'if a valid file handle was returned,
  'and the directory attribute is set
  'the folder exists
   FolderExists = (hFile <> INVALID_HANDLE_VALUE) And _
                  (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY)
   
  'clean up
   Call FindClose(hFile)
   
End Function


Private Function UnQualifyPath(ByVal sFolder As String) As String

  'trim and remove any trailing slash
   sFolder = Trim$(sFolder)
   
   If Right$(sFolder, 1) = "\" Then
      UnQualifyPath = Left$(sFolder, Len(sFolder) - 1)
   Else
      UnQualifyPath = sFolder
   End If
   
End Function
 Comments
This function will return the correct result regardless of any additional attributes assigned to the directory.

 
 

PayPal Link
Make payments with PayPal - it's fast, free and secure!

 
 
 
 

Copyright 1996-2011 VBnet and Randy Birch. All Rights Reserved.
Terms of Use  |  Your Privacy

 

 

Hit Counter