|
-
Thread Starter
Fanatic Member
FolderExists Issue
Hi All
I recently started to get some errors in my Folderexists function. If the Folder name was not the same case it would cause it to return False.
Code:
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
Public 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
i then swapped to
Code:
Private Declare Function PathIsDirectory Lib "shlwapi.dll" Alias "PathIsDirectoryA" _
(ByVal pszPath As String) As Long
Public Function FolderExists(ByVal sFolder As String) As Boolean
FolderExists = PathIsDirectory(sFolder)
End Function
and it works fine.
Why would the first example now say False if case is incorrect but the folder path is correct.
tks
-
Re: FolderExists Issue
Code:
Public Function FolderExists(sFolder As String) As Boolean
Dim FolderAttributes As Long
FolderAttributes = GetFileAttributesW(StrPtr(sFolder))
If FolderAttributes <> INVALID_HANDLE_VALUE Then FolderExists = (FolderAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY
End Function
-
Re: FolderExists Issue
I like to use the SHParseDisplayName or SHCreateItemFromParsingName API for this. If the return value is not equal to S_OK, the path does not exist. Another advantage of the API is that it can handle paths that do not have a drive letter.
Last edited by -Franky-; Today at 01:17 AM.
-
Re: FolderExists Issue
also FindFirstFileA is the old one, u should use FindFirstFileW.
I use FindFirstFileA only in my own folders that I know is VB6 friendly.
the folder is shortpath converted as well.
but, if u deal with unknown folders, u need to use Unicode aware.
-
Re: FolderExists Issue
And of course the WinRT solution:
Code:
Public Function FolderExists(sFolder As String) As Boolean
With New cAwait
FolderExists = .Await(StorageFolderStatics.GetFolderFromPathAsync(StrRef(sFolder))) = AsyncStatus_Completed
End With
End Function
Doesn't block the thread in case of unreachable network paths!
-
Re: FolderExists Issue
 Originally Posted by VanGoghGaming
And of course the WinRT solution:
Code:
Public Function FolderExists(sFolder As String) As Boolean
With New cAwait
FolderExists = .Await(StorageFolderStatics.GetFolderFromPathAsync(StrRef(sFolder))) = AsyncStatus_Completed
End With
End Function
Doesn't block the thread in case of unreachable network paths! 
But that can be also a problem if you don't want that, because you can receive events. Similar to having a DoEvents.
-
Re: FolderExists Issue
It's not similar to having a DoEvents, it is exactly that! 
Generally it is preferred to have a responsive UI rather than a frozen one but it is up to the developer to manage reentrancy problems. One major advantage is that it allows the user to cancel pending operations.
If you use an existing instance of the cAwait class, it is smart enough not to initiate another async operation while a previous one is still being awaited and the Cancel method can be used to abort the current async operation.
Last edited by VanGoghGaming; Today at 12:10 PM.
-
Thread Starter
Fanatic Member
Re: FolderExists Issue
i have noticed though that in the same app i changed the folderexists, i came across another issue.
I used the following (part of code) to check a file exists, if yes then pass to CImageInfo.
Code:
If FileExists(MyData.Fanart) = True Then
Dim AA As New CImageInfo
AA.ReadImageInfo MyData.Fanart
MyData.Fanart = "C\xxx\xxx\Fanart.jpg" (created in code) and the Fileexists finds it so passes on to the following function. but it errors out at m_Size = ConvertBytes(FileLen(sFileName), 2, True)
with path not found. In the folder is fanart.jpg and if i change the lowercase f to uppercase F and rerun the code works fine. as soon as i put it back to lower case f it fails.
Code:
Public Sub ReadImageInfo(sFileName As String)
' This is the sub to call to retrieve information on a file.
' Byte array buffer to store part of the file
Dim bBuf(BUFFERSIZE) As Byte
' Open file number
Dim iFN As Integer
' Set all properties to default values
m_Width = 0
m_Height = 0
m_Depth = 0
m_ImageType = itUNKNOWN
' here we will load the first part of a file into a byte
'array the amount of the file stored here depends on
'the BUFFERSIZE constant
iFN = FreeFile
Open sFileName For Binary As iFN
Get #iFN, 1, bBuf()
Close iFN
'get filesize of image
m_Size = ConvertBytes(FileLen(sFileName), 2, True) ' fails if filename is not the exact upper and lower case.
'more code her etc
any one have any ideas why this would suddenly start happening. is MS being more strict. ?
-
Re: FolderExists Issue
Are your api declarations really this
Code:
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
-
Re: FolderExists Issue
 Originally Posted by VanGoghGaming
It's not similar to having a DoEvents, it is exactly that!
Generally it is preferred to have a responsive UI rather than a frozen one but it is up to the developer to manage reentrancy problems. One major advantage is that it allows the user to cancel pending operations.
If you use an existing instance of the cAwait class, it is smart enough not to initiate another async operation while a previous one is still being awaited and the Cancel method can be used to abort the current async operation.
Some days ago I was debugging an issue in a program. It turned out that in the Form_Load I used a function that ended using another function that I was not aware that it worked async. It had been made by Claude:
Code:
'==========================================================================
' Run a VBScript in hidden mode and reads the first line of the output.
'==========================================================================
Private Function RunVBSAndGetResult(ByVal iTempPath As String, ByVal iResultPath As String) As String
Dim wsh As Object, fso As Object, ts As Object
Set wsh = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
wsh.Run "wscript " & VBSQuote(iTempPath), 0, True ' 0=hidden, True=wait
RunVBSAndGetResult = ""
If fso.FileExists(iResultPath) Then
Set ts = fso.OpenTextFile(iResultPath, 1) ' 1 = ForReading
If Not ts.AtEndOfStream Then RunVBSAndGetResult = Trim(ts.ReadLine)
ts.Close
End If
End Function
To fix that issue that I was having, I moved that code that was in Form_Load to a timer. It needed to run when program starts but not necessarily in the Form_Load.
I mean, one needs to be aware of the async calls, they change the game.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|