PRB: Search Using OpenFile API Instead of Dir/Dir$ Function

Last reviewed: May 14, 1997
Article ID: Q168519
The information in this article applies to:
  • Microsoft Visual Basic Standard, Professional and Enterprise Editions, 16-bit and 32-bit, for Windows, version 4.0

SYMPTOMS

The Dir/Dir$ function in Microsoft Visual Basic 4.0 may be used to test for a file's existence. It returns the name (or names) of the files that fit the search criteria. However, when using a UNC (Universal Naming Conventions) path to search for files that exist on a network directory, the Dir$ function may not return valid information. This behavior is most common when searching Microsoft Windows NT 4.0 network paths. It can also occur when searching for files that have unusual names (such as files that have no extension).

RESOLUTION

To work around this behavior, the OpenFile API call may be used to test for the existence of a file. Passing the parameter OF_EXIST to the OpenFile function causes OpenFile to search for an existing file. It does not write to or open the file when this parameter is passing by itself.

STATUS

Microsoft is researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.

MORE INFORMATION

The following sample shows how to use the OpenFile API function to check for the existence of a file named "Test" that has no file extension and is located at the following location: \\ServerName\ShareName:

   'If using the 32-bit version of Visual Basic 4.0, this declaration is
   'required;
   
   Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, _
                                             lpReOpenBuff As OFSTRUCT, _
                                             ByVal wStyle As Long) As Long

   'If using the 16-bit version of Visual Basic 4.0, this declaration is
   'required;
   
   Declare Function OpenFile Lib "kernel" (ByVal lpFileName As String, _
                                           lpReOpenBuff As OFSTRUCT, _
                                           ByVal wStyle As Integer) _
                                           As Integer

   'Both 16-bit and 32-bit utilize these constants and structure:
   
   Public Const OFS_MAXPATHNAME = 128
   Public Const OF_EXIST = &H4000
   
   Type OFSTRUCT
       cBytes As Byte
       fFixedDisk As Byte
       nErrCode As Integer
       Reserved1 As Integer
       Reserved2 As Integer
       szPathName(OFS_MAXPATHNAME) As Byte
   End Type

   'On the VB IDE menu bar select Tools/Options/Project/Startup Form and
   'set Sub Main() as the project start-up form.
   
   Sub main()
       Dim result As Integer
       Dim strPath As String
       Dim strucFname As OFSTRUCT
       Dim strResults As String
       Dim strSearchFile As String
   
       strSearchFile = "\\ServerName\ShareName\Test"
   
       result = OpenFile(strSearchFile, strucFname, OF_EXIST)
   
       'The above line causes OpenFile to search for the
       'file Test (no extension) on the server network path.
       'Passing the OF_EXIST parameter tells the OpenFile
       'function to search for the file, the file will not be
       'opened or modified in any way.
   
       If result <> -1 Then
           MsgBox "File found"
       Else
           MsgBox "File not found"
       End If
   End Sub

If the file in question is found, data pertaining to that file is placed into the variable strucFname.

REFERENCES

For additional information, please see the following article in the Microsoft Knowledge Base:

   ARTICLE-ID: Q112674
   TITLE     : How to Determine If a File Exists by Using DIR$
 

	
	


Keywords : vb4all vb4win kbprb
Version : 4.0
Platform : WINDOWS
Issue type : kbprb


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: May 14, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.