Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Excel / Programming / January 2006

Tip: Looking for answers? Try searching our database.

Dir function to check for file not reliable

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
RB Smissaert - 25 Jan 2006 15:09 GMT
Just discovered that you can't rely on the old Dir function to check if a
file exists or not and I thought it might be worth it to post this to this
forum.

I always used a function like this to test if a file exists:

Function bFileExists3(ByVal sFile As String) As Boolean

 bFileExists3 = Len(Dir(sFile)) > 0

End Function

This is just no good, try:

MsgBox bFileExists3(""), , Dir("")

I get True as Dir("") gives me: 256 colours.htm

When I make the function like this:

Function bFileExists3(ByVal sFile As String) As Boolean

 bFileExists3 = Len(Dir(sFile)) > 0 And Len(sFile) > 0

End Function

It will work in VBA, but not when I make an ActiveX dll in VB6.
Strangely, the len function doesn't give zero.
I have no public or private variables that could mess the function up.

I have found 2 alternatives to check if a file exists or not, the first one
is from
Randy Birch's site. Both seem to work fine.

Option Explicit
Private Declare Function PathFileExists Lib "shlwapi" _
                                       Alias "PathFileExistsA" _
                                       (ByVal pszPath As String) As Long

Function bFileExists(ByVal sPath As String) As Boolean

 'Determines if a file exists. This function
 'tests the validity of the file and path. It
 'works only on the local file system or on a
 'remote drive that has been mounted to a drive
 'letter.
 '
 'It will return False for remote file paths
 'that begin with the UNC names \\server
 'or \\server\share. It will also return False
 'if a mounted remote drive is out of service.
 '
 'Requires Version 4.71 and later of Shlwapi.dll

 bFileExists = PathFileExists(sPath) = 1

End Function

Function bFileExists2(ByVal sFile As String) As Boolean

 Dim lAttr As Long

 On Error Resume Next
 lAttr = GetAttr(sFile)
 bFileExists2 = (Err.Number = 0) And ((lAttr And vbDirectory) = 0)
 On Error GoTo 0

End Function

Will stick with the API one for now.

RBS
Patrick Molloy - 25 Jan 2006 15:35 GMT
set a reference to Microsoft's Scripting Runtime DLL. Create an object as a
Scripting.FileSystemObject then you can use the .FileExists method to check
er if a file exists ...you can also use th e.FolderExists method & navigate
the tree this way.

> Just discovered that you can't rely on the old Dir function to check if a
> file exists or not and I thought it might be worth it to post this to this
[quoted text clipped - 68 lines]
>
> RBS
RB Smissaert - 25 Jan 2006 16:37 GMT
I try to avoid setting more references as there always is the chance that
something will go wrong with it. Will stick for now with this:

Function bFileExists2(ByVal sFile As String) As Boolean

 Dim lAttr As Long

 On Error Resume Next
 lAttr = GetAttr(sFile)
 bFileExists2 = (Err.Number = 0) And ((lAttr And vbDirectory) = 0)
 On Error GoTo 0

End Function

RBS

> set a reference to Microsoft's Scripting Runtime DLL. Create an object as
> a
[quoted text clipped - 78 lines]
>>
>> RBS
Tom Ogilvy - 25 Jan 2006 15:38 GMT
Seems like you just need to add a check in your function for a valid file
name.  To the best of my knowledge, "" isn't a valid filename.  Apparently
Dir accepts it as a valid argument to return any file in the directory.

perhaps test

Function bFileExists3(ByVal sFile As String) As Boolean

  bFileExists3 = Len(Dir(sFile)) > 0 And sFile <> vbNullString

End Function

Signature

Regards,
Tom Ogilvy

> Just discovered that you can't rely on the old Dir function to check if a
> file exists or not and I thought it might be worth it to post this to this
[quoted text clipped - 68 lines]
>
> RBS
RB Smissaert - 25 Jan 2006 16:36 GMT
That is what I did, but with the Len function.
It solves it for my code in VBA, but strangely not for my
code in the VB6 dll.
I have gone with this one now:

Function bFileExists2(ByVal sFile As String) As Boolean

 Dim lAttr As Long

 On Error Resume Next
 lAttr = GetAttr(sFile)
 bFileExists2 = (Err.Number = 0) And ((lAttr And vbDirectory) = 0)
 On Error GoTo 0

End Function

RBS

> Seems like you just need to add a check in your function for a valid file
> name.  To the best of my knowledge, "" isn't a valid filename.  Apparently
[quoted text clipped - 82 lines]
>>
>> RBS
Peter T - 25 Jan 2006 16:50 GMT
Hi Bart,

I just tried in an ActiveX dll and the simple way works fine with both these
additional "checks"

'bFileExists3 = Len(Dir(sFile)) > 0 And sFile <> "" ' or vbNullString
bFileExists3 = Len(Dir(sFile)) > 0 And Len(sFile)

In fact, I don't see how either "check" could fail to return false if sFile
is zero length

Regards,
Peter T

> That is what I did, but with the Len function.
> It solves it for my code in VBA, but strangely not for my
[quoted text clipped - 104 lines]
> >>
> >> RBS
RB Smissaert - 25 Jan 2006 17:10 GMT
Hi Peter,

Yes, I agree, I must have made a mistake somewhere.
If it works in VBA it should work in VB6.

RBS

> Hi Bart,
>
[quoted text clipped - 126 lines]
>> >>
>> >> RBS
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.