|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic File API Routines FindFirstFile: Fastest Tests for Files or Subfolders |
|
Posted: | Thursday December 30, 2004 |
Updated: | Monday December 26, 2011 |
Applies to: | VB4-32, VB5, VB6 |
Developed with: | VB6, Windows XP |
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. |
|
As
an inadvertent call to Dir() can muck up an already-executing routine
using Dir(), here are a couple of blistering fast alternatives for
determining if a specified folder contains either subfolders or files.
This could be used to determine if a folder could be deleting with Kill,
or simply has a means to test whether a folder is completely empty.
The routine is non-recursive, as by definition its use would be to determine if even one file or subfolder existed. It also does not return the folder or file name found, just a simple Boolean true or false. |
BAS Module Code |
None. |
|
Form Code |
Drop a text box (Text1), two labels (Label1, Label2) and a command button (Command1) 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 = -1 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 FindNextFile Lib "kernel32" _ Alias "FindNextFileA" _ (ByVal hFindFile As Long, _ lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindClose Lib "kernel32" _ (ByVal hFindFile As Long) As Long Private Sub Form_Load() Text1.Text = "c:\windows" Command1.Caption = "Check for Folders/Files" End Sub Private Sub Command1_Click() Dim sRootPath As String Dim bResult1 As Boolean Dim bResult2 As Boolean sRootPath = QualifyPath(Text1.Text) Text1.Text = sRootPath 'reflect any change bResult1 = FolderContainsSubfolders(sRootPath) bResult2 = FolderContainsFiles(sRootPath) Select Case bResult1 Case True Label1.Caption = sRootPath & " contains subfolders" Case Else Label1.Caption = "There are no subfolders under " & sRootPath End Select Select Case bResult2 Case True Label2.Caption = sRootPath & " contains files" Case Else Label2.Caption = "There are no files in " & sRootPath End Select End Sub Private Function FolderContainsSubfolders(sRoot As String) As Boolean Dim wfd As WIN32_FIND_DATA Dim hFile As Long hFile = FindFirstFile(sRoot & "*.*", wfd) If hFile <> INVALID_HANDLE_VALUE Then Do If (wfd.dwFileAttributes And vbDirectory) Then 'an item with the vbDirectory bit was found 'but is it a system folder? If (Left$(wfd.cFileName, 1) <> ".") And _ (Left$(wfd.cFileName, 2) <> "..") Then 'nope, it's a user folder FolderContainsSubfolders = True Exit Do End If End If Loop While FindNextFile(hFile, wfd) End If Call FindClose(hFile) End Function Private Function FolderContainsFiles(sRoot As String) As Boolean Dim wfd As WIN32_FIND_DATA Dim hFile As Long hFile = FindFirstFile(sRoot & "*.*", wfd) If hFile <> INVALID_HANDLE_VALUE Then Do 'if the vbDirectory bit's not set, it's a 'file so we're done! If (Not (wfd.dwFileAttributes And vbDirectory) = vbDirectory) Then FolderContainsFiles = True Exit Do End If Loop While FindNextFile(hFile, wfd) End If Call FindClose(hFile) End Function Private Function QualifyPath(sPath As String) As String If Len(sPath) > 0 Then If Right$(sPath, 1) <> "\" Then QualifyPath = sPath & "\" Else QualifyPath = sPath End If Else QualifyPath = "" End If End Function |
Comments |
Alter the text box string to see the results of non-existent folders, root folders, or other directories. The routine could be modified to return True if a specific type of file was found by modifying the *.* in the FindFirstFile call in the FolderContainsFiles routine. (It must remain *.* to locate folders in FolderContainsSubfolders). |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |