[.net2] recherche les dossiers vides à partir d'un emplacement

Description

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

Codes Sources

A voir également

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.