C'est une petite fonction qui permet de rechercher les dossiers vides (sans fichiers ni sous-dossiers).
Dans cette source vous trouverez également quelques fonctions sommes toutes assez simple à comprendre sur la manipulation des fichiers/dossiers.
J'espère y avoir mis suffisamment de commentaires.
Désolé si les noms des fonctions et variables utilisées sont en anglais, je les ai récupérer d'un de mes projets personnel.
Voili voila...
Source / Exemple :
Private Function GetDirectoryNames(ByVal Path As String, Optional ByVal InSubDirectory As FileIO.SearchOption = FileIO.SearchOption.SearchTopLevelOnly) As Array
'--------------------------------------------------------
'Récupère les noms des dossiers présent dans un dossier
'--------------------------------------------------------
Dim sFoundDir As String
Dim arrayDir As Array
Dim byteTmp As Byte = 0
arrayDir = Array.CreateInstance(GetType(String), NumOfDirectories(Path, InSubDirectory))
For Each sFoundDir In My.Computer.FileSystem.GetDirectories(Path)
arrayDir(byteTmp) = sFoundDir
byteTmp += 1
Next
Return arrayDir
arrayDir = Nothing
End Function
Private Function NumOfDirectories(ByVal Path As String, Optional ByVal InSubDirectory As FileIO.SearchOption = FileIO.SearchOption.SearchTopLevelOnly) As Integer
'--------------------------------------------------------
'Renvoie le nombre de dossiers présent dans un dossier
'--------------------------------------------------------
Try
Return My.Computer.FileSystem.GetDirectories(Path, InSubDirectory).Count
Catch ex As Exception
Return -1
End Try
End Function
Private Function IsAccessDenied(ByVal DirectoryName As String) As Boolean
'----------------------------------------------
'Determine si l'accès à un dossier est refusé
'----------------------------------------------
Dim shtCnt As Short
Try
shtCnt = My.Computer.FileSystem.GetDirectories(DirectoryName, FileIO.SearchOption.SearchTopLevelOnly).Count
Return False
Catch ex As Exception
Return True
End Try
End Function
Private Function Engine_SearchEmptyDirs(ByVal Path As String, ByRef CurrentDir As String) As Array
'----------------------------------------------------------
'Recherche de dossiers vides (sans fichiers ni dossiers)
'----------------------------------------------------------
'Variable locales
Dim sArrayRet() As String = Nothing
Dim k As Integer = -1
Dim iFiles, iFolders As Integer
Dim sFolder, sFolderSub As String
'nom des dossiers racines
For Each sFolder In GetDirectoryNames(Path)
'test si l'accès au dossier et refusé... si il n'y est pas alors...
If IsAccessDenied(sFolder) = False Then
CurrentDir = sFolder
'récupère le nb de fichiers et sous-dossiers dans le dossier en cours (sFolder)
iFiles = Directory.GetFiles(sFolder).Length
iFolders = Directory.GetDirectories(sFolder).Length
'si aucun fichiers ni sous-dossiers récupération du nom du dossier
If (iFolders + iFiles) = 0 Then
k += 1 : ReDim Preserve sArrayRet(k)
sArrayRet(k) = sFolder
End If
'sous-dossiers du dossier en cours (sFolder)
For Each sFolderSub In Directory.GetDirectories(sFolder, "*", SearchOption.AllDirectories)
'test si l'accès au dossier et refusé... si il n'y est pas alors...
If IsAccessDenied(sFolderSub) = False Then
CurrentDir = sFolderSub
'récupère le nb de fichiers et sous-dossiers
iFiles = Directory.GetFiles(sFolderSub).Length
iFolders = Directory.GetDirectories(sFolderSub).Length
'test si aucun fichiers ni sous-dossiers et récupère le nom du dossier
If (iFolders + iFiles) = 0 Then
k += 1 : ReDim Preserve sArrayRet(k)
sArrayRet(k) = sFolderSub
End If
End If
Next
End If
Next
Return sArrayRet
sArrayRet = Nothing
End Function
Conclusion :
Je sais que beaucoup d'entre vous préfèrerons une fonctions récursive pour ce genre d'opération mais j'espère que cette source va en aider quand même quelques-uns...
Sinon dans ma fonction "Engine_SearchEmptyDirs" le second argument doit retourner le dossier en cours d'analyse mais cela ne marche pas malgré l'utilisation d'un ByRef. Alors si quelqu'un peut apporter la solution merci... :)
Utilisation de la fonction (Recherche dans le lecteur c: mais vous pouvez indiquer un dossier cela marche aussi)
Dim TabDossier() as String
Dim DossierEnCours as String
Dim i as Interger
TabDossier=Engine_SearchEmptyDirs("c:\", DossierEnCours)
For i = 0 To TabDossier.Length - 1
ListBox1.Items.Add(TabDossier(i))
Next
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.