Supprimer un répertoire et tout son contenu (sous-dossiers et fichiers)

5/5 (42 avis)

Snippet vu 45 750 fois - Téléchargée 40 fois

Contenu du snippet

Cette fonction est extrèmement simple. Elle permet de supprimer un dossier et tout son contenu (sous-répertoires et fichiers). La fonction renvoie "True" si le processus de suppression s'est déroulé normalement. Sinon, elle renvoie "False".

Particularités intéressantes :
- Elle permet de supprimer les fichiers et les dossiers qui sont en lecture seule;
- Elle permet de supprimer les fichiers et les dossiers cachés (y compris les fichiers système tels que Thumbs.db, ...).
- Elle permet de supprimer le contenu d'un lecteur.

Limitations :
- Elle ne permet pas la suppression de fichiers en cours d'utilisation;
- Elle ne permet pas la suppression de fichiers et/ou de dossiers en cours de visualisation (dans l'explorateur Windows ou autre).

La fonction est désormais disponible en 3 versions : la première ne permet pas le vidage des dossiers temporaires de Windows, la seconde bien. En fait, la deuxième permet le vidage de dossiers contenant des fichiers en cours d'utilisation. La troisième est une évolution de la seconde qui permet, si on le désire, de ne supprimer que les répertoires vides et les fichiers vides (dont la taille est de 0 octets).

ATTENTION :
- Prenez la peine de lire les remarques !

Pour les débutants :
- Ne copiez, dans votre module ou programme, qu'une des 3 versions de la fonction !

Source / Exemple :


' Version qui ne permet pas le vidage des dossiers temporaires de Windows :

Public Function SupprimeRépertoire(Répertoire As String) As Boolean
    On Error GoTo Erreur
    Dim SousRépertoire As String
    Dim Val As String
    SousRépertoire = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
    Do While SousRépertoire <> ""
        If SousRépertoire <> "." And SousRépertoire <> ".." Then
            If (GetAttr(Répertoire & SousRépertoire) And vbDirectory) = vbDirectory Then
                ' C'est un sous-répertoire. Donc, on effectue un appel récursif.
                SupprimeRépertoire (Répertoire & SousRépertoire & "\")
            Else
                ' C'est un fichier. Donc, on concatène le nom du répertoire avec le sien.
                Val = Répertoire & SousRépertoire
                ' On s'assure que le fichier n'est pas en lecture seule.
                SetAttr Val, vbReadOnly = 0
                ' On supprime le fichier.
                Kill (Répertoire & SousRépertoire)
            End If
        End If
        ' Dir peut avoir été appelé, donc on réinitialise le tout.
        SousRépertoire = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
        ' Pour passer le répertoire courant et le répertoire parent.
        If SousRépertoire = "." Then
          SousRépertoire = Dir
        End If
        If SousRépertoire = ".." Then
          SousRépertoire = Dir
        End If
    Loop
    If ((Right(Répertoire, 2)) <> ":\") Then
        ' Ce n'est pas la racine du disque, donc on supprime après s'être assuré que le répertoire n'est pas en lecture seule.
        SetAttr Répertoire, vbReadOnly = 0
        RmDir Répertoire
    End If
    SupprimeRépertoire = True
    Exit Function
    
Erreur:
    SupprimeRépertoire = False
End Function

' Remarque : Si un fichier ou un dossier ne peut être supprimé parce qu'il est en cours d'utilisation, la valeur retournée est "False". Les fichiers qui suivent celui qui n'a pu être supprimé, ne sont donc pas supprimés.

' Version qui permet le vidage des dossiers temporaires de Windows (vidage de dossiers contenant des fichiers en cours d'utilisation) :

Public Function SupprimeRépertoire(Répertoire As String) As Boolean
    On Error GoTo Erreur
    Dim SousRépertoireOuFichier As String
    Dim Val As String
    Dim MyArray() As String
    Dim I As Long
    Dim J As Long
    SousRépertoireOuFichier = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
    I = 0
    Do While SousRépertoireOuFichier <> ""
        If SousRépertoireOuFichier <> "." And SousRépertoireOuFichier <> ".." Then
            ' Redimensionne le tableau dynamique tout en conservant les éventuelles valeurs présentes.
            ReDim Preserve MyArray(I + 1)
            If (GetAttr(Répertoire & SousRépertoireOuFichier) And vbDirectory) = vbDirectory Then
                MyArray(I) = Répertoire & SousRépertoireOuFichier & "\"
            Else
                MyArray(I) = Répertoire & SousRépertoireOuFichier
            End If
            I = I + 1
        End If
        SousRépertoireOuFichier = Dir
    Loop
    J = 0
    Do While J < I
        If Right(MyArray(J), 1) = "\" Then
            ' C'est un sous-répertoire. Donc, on effectue un appel récursif.
            SupprimeRépertoire (MyArray(J))
        Else
            ' C'est un fichier.
            ' Resume Next pour passer à l'instruction suivante si la suppression échoue.
            On Error Resume Next
            Val = MyArray(J)
            ' On s'assure que le fichier n'est pas en lecture seule.
            SetAttr Val, vbReadOnly = 0
            ' On supprime le fichier.
            Kill (Val)
            ' On réactive la gestion des erreurs normale.
            On Error GoTo Erreur
        End If
        J = J + 1
    Loop
    If ((Right(Répertoire, 2)) <> ":\") Then
        ' Ce n'est pas la racine du disque, donc on supprime après s'être assuré que le répertoire n'est pas en lecture seule.
        SetAttr Répertoire, vbReadOnly = 0
        RmDir Répertoire
    End If
    SupprimeRépertoire = True
    Exit Function
    
Erreur:
    SupprimeRépertoire = False
End Function

' Remarque : Si cette fonction est utilisée pour vider un répertoire temporaire de Windows, il est fort probable qu'elle retourne False, car elle ne sait évidemment pas supprimer un répertoire contenant des fichiers en cours d'utilisation.
' Elle ne fait que passer ceux qui ne sont pas supprimables. Donc, elle supprimera tout ce qu'il est possible de supprimer.
' Si le dossier temporaire de Windows ne contient aucun fichier en cours d'utilisation, la fonction pourra faire totalement son travail et retournera True.
' N'oubliez pas de recréer le dossier temporaire dans ce cas !
' Sinon, vous risquez d'avoir quelques surprises lors des prochaines installations de logiciels, ...

' Version qui permet, si on le désire, de ne supprimer que les répertoires et les fichiers vides :
  
Public Function SupprimeRépertoire(Répertoire As String, Optional ByVal FichiersVidesSeulement As Boolean = False) As Boolean
    On Error GoTo Erreur
    Dim SousRépertoireOuFichier As String
    Dim Val As String
    Dim MyArray() As String
    Dim I As Long
    Dim J As Long
    SousRépertoireOuFichier = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
    I = 0
    Do While SousRépertoireOuFichier <> ""
        If SousRépertoireOuFichier <> "." And SousRépertoireOuFichier <> ".." Then
            ' Redimensionne le tableau dynamique tout en conservant les éventuelles valeurs présentes.
            ReDim Preserve MyArray(I + 1)
            If (GetAttr(Répertoire & SousRépertoireOuFichier) And vbDirectory) = vbDirectory Then
                MyArray(I) = Répertoire & SousRépertoireOuFichier & "\"
            Else
                MyArray(I) = Répertoire & SousRépertoireOuFichier
            End If
            I = I + 1
        End If
        SousRépertoireOuFichier = Dir
    Loop
    J = 0
    Do While J < I
        If Right(MyArray(J), 1) = "\" Then
            ' C'est un sous-répertoire. Donc, on effectue un appel récursif.
            SupprimeRépertoire MyArray(J), FichiersVidesSeulement
        Else
            ' C'est un fichier.
            ' Resume Next pour passer à l'instruction suivante si la suppression échoue.
            On Error Resume Next
            Val = MyArray(J)
            
            If (Not FichiersVidesSeulement) Then
                ' On s'assure que le fichier n'est pas en lecture seule.
                SetAttr Val, vbReadOnly = 0
                ' On supprime le fichier.
                Kill (Val)
            Else
                If (FileLen(Val) = 0) Then
                    ' On s'assure que le fichier n'est pas en lecture seule.
                    SetAttr Val, vbReadOnly = 0
                    ' On supprime le fichier.
                    Kill (Val)
                End If
            End If

            ' On réactive la gestion des erreurs normale.
            On Error GoTo Erreur
        End If
        J = J + 1
    Loop
    If ((Right(Répertoire, 2)) <> ":\") Then
        ' Ce n'est pas la racine du disque, donc on supprime après s'être assuré que le répertoire n'est pas en lecture seule.
        SetAttr Répertoire, vbReadOnly = 0
        RmDir Répertoire
    End If
    SupprimeRépertoire = True
    Exit Function
     
Erreur:
    SupprimeRépertoire = False
End Function
  
' Remarque : Toutes les remarques de la deuxième version s'appliquent également à celle-ci. Veuillez les lire aussi...
' Pour ne supprimer que les répertoires et les fichiers vides, effectuez un appel dans le genre de celui qui suit :
' SupprimeRépertoire "X:\MonDossier\", True

Conclusion :


Pas de bugs connus.
Voilà !
Si mon travail vous intéresse, rendez-vous sur mon site Web : http://www.tcedi.com

Bonne programmation !!!

A voir également

Ajouter un commentaire Commentaires
alucard02 Messages postés 26 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 30 janvier 2009
18 déc. 2007 à 19:40
c'est exactement ce que je cherchais...
Merci
victor110 Messages postés 86 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 13 mai 2010
24 nov. 2006 à 18:02
On peut aussi utiliser la fonction
DELETE ds VB
Bonne @ prog!!!
forchi Messages postés 33 Date d'inscription lundi 21 juin 2004 Statut Membre Dernière intervention 24 mai 2008
3 nov. 2006 à 13:48
Pour info

Ceux qui sont sous .net:

Dim Dir As New DirectoryInfo("Chemin de mon dossier a supprimer")
Dir.Delete(True)
cs_PaTaTe Messages postés 2107 Date d'inscription mercredi 21 août 2002 Statut Contributeur Dernière intervention 19 février 2021 2
25 mai 2006 à 18:40
Problème résolu comme indiqué dans le message CS

La fonction tourne correctement. :)
tcedi Messages postés 59 Date d'inscription samedi 27 juillet 2002 Statut Membre Dernière intervention 11 septembre 2003
25 mai 2006 à 12:57
Je vous envoie un message CS avec mon adresse e-Mail de manière à ce que vous puissiez m'envoyer l'arborescence posant le problème compressée en 7z ou autre.

Ainsi, je pourrai certainement reproduire le problème et y trouver une solution...

P.S. : Pour la mise en cache, c'est pareil chez moi, mais la plupart des gens la laissent active...

P.P.S. : J'aimerais vraiment savoir si ce sont des dossiers ou des fichiers qui posent le problème, mais également si l'explorateur Windows était ouvert sur le dossier ou un des sous-dossiers (cela pose parfois problème, cfr. limitations) lors de l'exécution de la fonction.

Bonne prog. !
Afficher les 42 commentaires

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.