|
Modules: VBA Developer's Handbook - Code de remplacement pour certaines fonctions du chapitre 12 |
Author(s) Ken Getz |
|
---Soumis par Ken Getz---
VBA Developer's Handbook - Code de remplacement pour certaines fonctions du chapitre 12.
Dans VBA Developer's Handbook, au chapitre 12, la procédure dhDelTree
possède un sérieux problème si vous lui fournissez le chemin d'un disque
autre que le disque actuel. Dans un tel cas, la procédure efface les fichiers
du disque courant, non du disque spécifié. Cela peut entraîner de sérieuse
perte de données.
La fonction de replacement suivante effectue le changement de disque et de
répertoire à ceux spécifiés, de sorte que l'effacement s'effectue
correctement. N'utilisez pas la fonction dhDelTree
publiée dans le bouquin -- assurez vous de remplacer toutes les copies par
cette nouvelle version, pour éviter de perdre des données.
Aucune fonction ne fonctionnera proprement si vous ne possédez pas les
autres procédures du chapitre 12, il est donc inutile de télécharger ces
correctifs si vous ne possédez pas le bouquin.
Private Declare Function SetCurrentDirectory _
Lib "kernel32" Alias "SetCurrentDirectoryA" _
(ByVal lpPathName As String) As Long
Function dhDelTree(ByVal Directory As String, _
Optional RemoveRoot As Boolean = True, _
Optional ByVal Level As Integer = 1) As Boolean
On Error GoTo HandleErrors
Dim strFilename As String
Dim strDirectory As String
strDirectory = dhFixPath(Directory)
If Len(Dir(strDirectory, vbDirectory)) = 0 Then
GoTo ExitHere
End If
If dhFixPath(CurDir) = strDirectory Then
MsgBox "Unable to delete the current directory. " & _
"Move to a different directory, and try again."
GoTo ExitHere
End If
strFilename = Dir(strDirectory & "*.*")
Do Until strFilename = ""
Kill strDirectory & strFilename
strFilename = Dir
Loop
Do
strFilename = Dir(strDirectory & "*.*", vbDirectory)
Do While strFilename = "." Or strFilename = ".."
strFilename = Dir
Loop
If strFilename = "" Then
Exit Do
Else
If Not dhDelTree(strDirectory & strFilename, True, Level + 1) Then
GoTo ExitHere
End If
End If
Loop
If Level = 1 Imp RemoveRoot Then
RmDir strDirectory
End If
dhDelTree = True
ExitHere:
Exit Function
HandleErrors:
Select Case Err.Number
Case 75
Resume Next
Case Else
dhDelTree = False
MsgBox Err.Description, vbExclamation, _
"Error " & Err.Number & " in dhDelTree"
Resume ExitHere
End Select
End Function
Dans VBA Developer's Handbook, au chapitre 12, si vous utilisez la
fonction dhDir pour parcourir les dossiers, la fonction ne libère pas
correctement une ressource référant à ce dossier et vous ne serez pas capable
d'effacer ce dossier à moins de quitter VBA (en quittant l'application
hôtesse). La fonction de remplacement qui suit résoudra ce problème.
Function dhDir(Optional ByVal strPath As String = "", _
Optional lngAttributes As Long = vbNormal, _
Optional fExclusive As Boolean = True) As String
Dim fd As WIN32_FIND_DATA
Static hFind As Long
Static lngAttr As Long
Static fEx As Boolean
Dim strOut As String
If strPath = "" Then
If hFind > 0 Then
If CBool(FindNextFile(hFind, fd)) Then
strOut = dhFindByAttr(hFind, fd, lngAttr, fEx)
End If
End If
Else
lngAttr = lngAttributes
fEx = fExclusive
If Right(strPath, 1) = "\" Then
strPath = strPath & "*.*"
End If
hFind = FindFirstFile(strPath, fd)
If hFind > 0 Then
strOut = dhFindByAttr(hFind, fd, lngAttr, fEx)
End If
End If
If Len(strOut) = 0 Then
If hFind > 0 Then
Call FindClose(hFind)
End If
End If
dhDir = strOut
End Function
|