begin process at 2012 02 14 05:57:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > SUPPRIMER UN RÉPERTOIRE ET TOUT SON CONTENU (SOUS-DOSSIERS ET FICHIERS)

SUPPRIMER UN RÉPERTOIRE ET TOUT SON CONTENU (SOUS-DOSSIERS ET FICHIERS)


 Information sur la source

Note :
7,5 / 10 - par 6 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :supprimer, répertoire, dossier, fichiers, vider Niveau :Débutant Date de création :29/12/2002 Date de mise à jour :24/05/2006 20:34:35 Vu :32 875

Auteur : tcedi

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (42)
Ajouter un commentaire et/ou une note


 Description

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

  • ' 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
' 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 !!!


 Historique

23 janvier 2005 01:46:03 :
La mise à jour comprends : - Une gestion améliorée de la suppression des lecteurs (Ne retourne plus False alors que tout s'est bien passé); - Ajout de commentaires; - Ajout d'une seconde version de la fonction permettant le vidage des dossiers temporaires de Windows ou tout autre dossier contenant des fichiers en cours d'exécution. Avec cette version de la fonction, tout ce qui est supprimable est supprimé !
23 janvier 2005 09:47:52 :
Petite clarification des commentaires
24 mai 2006 20:34:35 :
Ajout d'une troisième version de la fonction permettant, si on le désire, de ne supprimer que les répertoires et les fichiers vides.

 Sources du même auteur

Source avec Zip EXÉCUTER UN PROGRAMME ET ATTENDRE OU NON LA FIN DE SON EXÉCU...
Source avec Zip Source avec une capture SYSTÈME DE MISE À JOUR AUTOMATIQUE PAR INTERNET : T.C.E.D.I....
RÉCUPÉRER LA TAILLE D'UN FICHIER À LA FAÇON DE L'EXPLORATEUR...
FORMATER UNE DISQUETTE

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) MODIFIER LES EXTENSION DES FICHIERS par okosa
ROUTINE DIR RÉCURSIVE POUR OBTENIR LA LISTE DE TOUS LES FICH... par kerisolde
Source avec Zip Source avec une capture FILE,SECURITY,FICHIER par okosa
Source avec Zip Source avec une capture Source .NET (Dotnet) PATCHEUR DE FICHIER par tototh
Source avec Zip Source avec une capture LECTURE DES INFORMATIONS DES DISQUES COMPOSANT UN ENSEMBLE R... par jack

 Sources en rapport avec celle ci

ROUTINE DIR RÉCURSIVE POUR OBTENIR LA LISTE DE TOUS LES FICH... par kerisolde
OUTLOOK EFFACER PAR CODE LES MAILS DE LA BOITE DES ÉLÉMENTS ... par houtas
Source avec Zip Source avec une capture FOLDER HELPER - DOSSIERS SPECIAUX, MANIPULATION DE DOSSIERS,... par PCPT
Source avec Zip SUPPRESSION DE CERTAINS FICHIERS DANS UN RÉPERTOIRE PARTICUL... par noritakaroi2labaston
Source avec Zip SUPPRIMER DES FICHIERS EN DOUBLE (D'APRES LEUR NOM) par couteau7

Commentaires et avis

Commentaire de LordBob le 29/12/2002 23:24:29

exactement la source ke je chercher, un grand merci a toi tcedi

Commentaire de tcedi le 29/12/2002 23:32:19

Mais, de rien, LordBob !!! J'espère que cette source te servira bien !
Bonne prog !

Commentaire de SupraDolph le 30/12/2002 00:43:16

C pa mal mais, Personellement j'utiliserai plutôt :

Public Function SupprimeRepertoire(Repertoire As String)
If Right(Repertoire, 1) = "" Then Repertoire = Left(Repertoire, Len(Repertoire) - 1)
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.DeleteFile Repertoire & "*.*", True
fs.DeleteFolder Repertoire, False
End Function

Bon Prog
                                                  SupraDolph

Commentaire de SupraDolph le 30/12/2002 00:55:07

oups sa ne prend pas les backslash

Public Function SupprimeRepertoire(Repertoire As String)
If Right(Repertoire, 1) = "BACKSLASH" Then Repertoire = Left(Repertoire, Len(Repertoire) - 1)
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.DeleteFile Repertoire & "BACKSLASH*.*", True
fs.DeleteFolder Repertoire, False
End Function

Bon Prog
                                                  SupraDolph

Commentaire de tcedi le 30/12/2002 07:55:00

C'est vrai qu'il est possible d'utiliser le FSO et que c'est plus simple ! Cependant, si tu utilises le FSO pour supprimer un répertoire avec un bon AntiVirus, ce dernier va te signaler que ton programme exécute peut-être un script malveillant et il va te demander si tu désires l'autoriser à exécuter ce script ou non. Cela prend du temps. Et en général, ça ne plait pas aux utilisateurs finaux d'avoir l'impression de se faire hacker à chaque fois qu'ils utilisent ton programme ! lol !

Merci pour tes commentaires SupraDolph !

Bonne prog !!!

Commentaire de shaoni le 30/12/2002 08:42:01

de plus avec fso l'utilisateur est obliger d'avoir wsh installer !! encore des soucis en plus ! !
au moin il y a de dependance au mieux ! c'est !

Commentaire de SupraDolph le 30/12/2002 13:28:33

il est peut être possible qu'un bon antivirus le détecte mais avec norton 2002 je n'est pas de pb.
après moi je donne ce source a titre d'exemple pour que l'on puisse comparer +ieur source. Je trouve qu'il est bien d'avoir le choix entre 2 (voir +) sources
                                                          SupraDolph

Commentaire de tcedi le 30/12/2002 13:47:12

Je suis tout à fait d'accord avec toi, SupraDolph !!! Il faut montrer les différentes manières d'effectuer une même opération. Et, laisser le choix aux développeurs de suivre telle ou telle méthode.

P.S. : Active un peu les heuristiques Bloodhound de ton Norton AntiVirus 2002 au niveau de protection maximal et teste ton code avec le FSO. Normalement, il devrait réagir !!!

Bonne prog !!!

Commentaire de Sirocooo le 31/12/2002 14:04:22

on peut aussi utiliser la command dos DELTREE et dans ce cas
il n'y à plus que 3 lignes de code

Commentaire de tcedi le 31/12/2002 16:34:52

C'est vrai Sirocooo, on peut procéder comme cela !!! Cependant, deltree n'existe plus sous Windows 2000, XP. Là, il faut utiliser "rmdir /q /s". Ma fonction tourne sous les différentes versions de Windows. Je trouve que c'est un petit peu plus pratique.

Bonne prog !

Commentaire de Rock le 03/04/2003 12:39:42

magnifique juste ce dont j avais besoin encore merci

Commentaire de SuperTonic le 21/08/2003 16:37:30

Super la source ... Mais comment qu'on fait si on ne veux pas que le répertoire racine soit effacer. (Juste tous les fichiers et ss répertoires) ?
Merki

Commentaire de tcedi le 22/08/2003 10:27:51

Merci SuperTonic !!!

Pour faire ce que vous voulez (supprimer tous les sous-dossiers et fichiers, mais pas le répertoire lui-même), il y a de nombreuses possibilités !

Solution la plus simple : Juste après l'appel de la fonction, recréer le répertoire. (Bon ! Là, après avoir supprimé le dit répertoire, on le recrée, mais c'est ce qu'il y a de plus simple !)

Exemple :

Dim Chemin As String
Chemin="C:Temp"
SupprimeRépertoire(Chemin)
MkDir(Chemin)

Autre solution : Faire un copier/coller de la fonction, la renommer en SuppRep ou autre, laisser les appels à SupprimeRépertoire, et supprimer les 2 lignes après loop.
Au lieu d'appeler SupprimeRépertoire pour effectuer la suppression du dossier, il suffit d'appeler SuppRep, et le tour est joué !

Exemple :

Public Function SuppRep(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 &lt;&gt; ""
        If SousRépertoire &lt;&gt; "." And SousRépertoire &lt;&gt; ".." Then
            If (GetAttr(Répertoire & SousRépertoire) And vbDirectory) = vbDirectory Then
                SupprimeRépertoire (Répertoire & SousRépertoire & "")
            Else
                Val = Répertoire & SousRépertoire
                SetAttr Val, vbReadOnly = 0
                Kill (Répertoire & SousRépertoire)
            End If
        End If
        SousRépertoire = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
        If SousRépertoire = "." Then
        SousRépertoire = Dir
        End If
        If SousRépertoire = ".." Then
        SousRépertoire = Dir
        End If
    Loop
    SuppRep = True
    Exit Function
    
Erreur:
    SuppRep = False
End Function


Voilà ! Il y a plein d'autres solutions, mais je m'arrête là !

Bonne prog !!!

Commentaire de SuperTonic le 22/08/2003 10:44:45

Ok, je vais essayer. Le truc c'est que je ne peux en aucun cas supprimer le dossier origine (serveur/droits) .
je vais donc voir de plus pret ton exemple. Merci vraiement bcp

Commentaire de magicdibot le 04/09/2003 23:08:22

Nickel.. pil poil ce que je cherchais... lol
Merci bi1.... en + en récursif.. j aime -)

Commentaire de tcedi le 05/09/2003 10:22:42

Merci magicdibot !

Le principal, c'est que ma source puisse servir à d'autres ! C'est pour cela que je l'ai postée sur VBFrance !

Bonne prog !

Commentaire de tcedi le 05/09/2003 10:29:02

Une version améliorée de cette fonction (SupprimeRépertoire) est incluse dans T.C.E.D.I. Direct Update Version 1.0.0.0 ! Si cela vous intéresse, rendez-vous sur cette page : http://www.vbfrance.com/article.aspx?Val=8416
Vous pouvez également vous rendre sur le site Web officiel de la T.C.E.D.I. : http://www.tcedi.be.tf

Bonne prog à tous !!!

Commentaire de neoburne le 15/11/2003 18:57:42

Salut c néo

Bah en fait, je ne vois pas du tout comment est qu'elle se compile sous VB. Je sais que c'est une fonction et qu'il faut l'appeler sous le pgm principal, mais je me demander comment on y fait appel ds le pgm. Est ce qu'on pourait me donner un coup de main? ou de pied mm ??? LOL

MERCI

BONNE PROG

Commentaire de tcedi le 15/11/2003 19:40:40

Salut neoburne !!!

En fait, il n'y a rien de plus simple à mettre en oeuvre !!!

Tu ajoutes un nouveau module et tu y colles le code de la fonction ci-dessus. (Tu peux également le copier/coller directement dans le code de ta fenêtre, mais c'est moins "modulaire" !!!)

Ensuite, dans le code de ta fenêtre (au niveau d'un clic sur un bouton ou autre), tu appelles la fonction de cette manière :

SupprimeRépertoire("C:Temp")

Voilà, j'espère avoir répondu à ta question !!!

Bonne continuation neoburne !!!!!

Commentaire de neoburne le 15/11/2003 21:55:05

Bah en fait, la je suis perdu.
J'ai bien insérer ton code, avec la fonction SupprRépertoire, avec l'appel de la fonction dans le pgm principal, seulement, il ne m'efface rien.

En fait, je veux que lorsque j'ouvre un .exe de vb, il me supprime le dossier que j'ai sélectionné auparavant.

Alors, j'ai insérer mon pgm pricipal dans Private Sub Form_Load(), et l'appel à la fonction. Mais cela ne marche pas.

Pourrais-tu m'aider s'il te plaît ?

Merci !!!!!

Neoburn

Commentaire de tcedi le 15/11/2003 22:11:17

No problemo !!!

Je t'envoie un petit exemple !

Commentaire de tlsosiris le 05/05/2004 19:02:01

salut a tous si y'a bien un truc qui m'enerve c bien qu'on expilque rien sur les sources, pensez aux newbies bordel.
Par exemple je le place ou la fonction, je l'appel command, je met quoi ds la form, etc...
Sinon merci pour toute ces sources tres instructives.
Ps : a l'avenir commentai vos sources ;p
Osiris : au dela du possible

Commentaire de almey le 08/05/2004 12:05:41

Salut ...
Je trouve ta fonction excellente ... mais juste un petit problème ...

Je souhaite m'en servir notament pour vider le dossier TEMP, TEMPORY INTERNET FILES ... mais ta fonction réalise une boucle infini sur le fichier Index.dat (Fichier que l'on ne peut pas supprimer)

Aurais-tu une solution à ce problème ??

Merci ...

Commentaire de almey le 08/05/2004 12:05:49

Salut ...
Je trouve ta fonction excellente ... mais juste un petit problème ...

Je souhaite m'en servir notament pour vider le dossier TEMP, TEMPORY INTERNET FILES ... mais ta fonction réalise une boucle infini sur le fichier Index.dat (Fichier que l'on ne peut pas supprimer)

Aurais-tu une solution à ce problème ??

Merci ...

Commentaire de trouble magma le 10/12/2004 08:56:18

j'imagine que si au lieu de :

Kill (Répertoire & SousRépertoire)

tu mets :

if SousRépertoire = "Index.dat" then
      Kill (Répertoire & SousRépertoire)
end if

ca devrait marcher......

Commentaire de tcedi le 23/01/2005 09:33:29

Ta solution ne saurait convenir, trouble magma.

Si un fichier est en cours d'exécution ou verrouillé par un programme, il ne pourra de toute façon pas être supprimé ! On n'est pas sous UNIX (là, c'est possible). De plus, supposer que l'unique fichier qui pose problème est "Index.dat" est beaucoup trop restrictif.

La seule possibilité, c'est de passer les fichiers ou les dossiers qui ne sont pas supprimables.

Cette opération était impossible avec la première version de ma fonction.

La seconde version apporte une solution au vidage des dossiers temporaires.

Bonne prog @ tous et à toutes !

P.S. : Je n'ai pas pu répondre plus tôt, par manque de temps. Désolé ! Là, je fais une petite pause avant de me remettre à étudier... C'est vous dire ce que je fais de mes loisirs ;-)...

Commentaire de Matyouz le 05/05/2005 16:32:33

Erreur d'execution 53 "Fichier introuvable .... sur cette ligne : If (GetAttr(Répertoire & SousRépertoireOuFichier) And vbDirectory) = vbDirectory Then

J'envoie "c:\Nouveau" à cette fonction compilée dans un module ... le programme plante alors que ce répertoire existe bien !!!

Que veux dire cette ligne exactement ? vbDirectory contient la valeur 16 ... ça veut dire quoi ??

Commentaire de tcedi le 05/05/2005 17:17:50

Tout à fait normal que cela ne fonctionne pas avec ce que tu passes en paramètre, Matyouz.

Mets plutôt ceci : "C:\Nouveau\".

Ainsi, ça ira !

Je te conseille vivement, pour t'assurer qu'il y a bien un backslash à la fin du chemin de ton répertoire, d'utiliser une fonction du genre :

Public Function AddBackSlashIfNecessary(Directory As String)
    If Right(Directory, 1) <> "\" Then
        Directory = Directory & "\"
    End If
    AddBackSlashIfNecessary = Directory
End Function

Pour ce qui est de vbDirectory, c'est une constante. Elle désigne un répertoire. La ligne en question permet de déterminer si l'élément du système de fichier désigné par le chemin complet est un répertoire ou non.

Je fais cela à l'aide d'un opérateur "Et" binaire.

Exemple :

    00010110
Et 00010000
    -------------
    00010000

Si le bit est positionné, c'est que c'est bien un répertoire et la valeur sera égale à la constante vbDirectory.

cfr. MSDN : Dir, fonction et And, opérateur.

Voilà !

J'espère avoir été assez clair.

Bonne prog !

Commentaire de Matyouz le 05/05/2005 17:37:17

ok ! ça marche impeccable ... merci pour ta réponse rapide !

Commentaire de tcedi le 29/05/2005 23:04:32

Rien de plus simple à faire, mkos2005 !

1. Tu crées un nouveau module dans ton projet.
2. Tu copies le code d'une des 2 versions de la fonction ci-dessus (selon tes besoins).
3. Tu colles le code en question dans le module.
4. Au niveau de la procédure de traitement d'un clic sur un bouton, ou ailleurs dans ton code, tu appelles la fonction comme suit : SupprimeRépertoire("C:\LeRépertoireASupprimer\")

Tu peux, bien entendu, tester la valeur renvoyée par la fonction si tu en as besoin.

Voilà !

Bonne prog !!!

Commentaire de PaTaTe le 23/05/2006 11:53:29

pourquoi ne pas mettre en paramètres optionel ne supprimer que les répertoire vide / ou ceux qui contiennent que des fichiers de 0 octets ?

Commentaire de tcedi le 24/05/2006 08:19:55

Cher PaTaTe,

Pour obtenir le résultat escompté, il suffit d'effectuer les modifications suivantes :

1. Partir de la deuxième version de la fonction.

2. Remplacer : Public Function SupprimeRépertoire(Répertoire As String) As Boolean
   Par : Public Function SupprimeRépertoire(Répertoire As String, Optional ByVal FichiersVidesSeulement As Boolean = False) As Boolean

3. Remplacer l'appel récursif : SupprimeRépertoire (MyArray(J))
   Par : SupprimeRépertoire MyArray(J), FichiersVidesSeulement

4. Remplacer le code de suppression de fichiers :

   ' On s'assure que le fichier n'est pas en lecture seule.
   SetAttr Val, vbReadOnly = 0
   ' On supprime le fichier.
   Kill (Val)

   Par :

   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

5. Veiller à passer True dans l'appel de la fonction.

C'est tout !

Bonne programmation !

Commentaire de PaTaTe le 24/05/2006 09:23:49

Apparement cette modification ne fonctionne pas :(

Je regarderais ça en détail dès que j'aurais 5 minutes.

Commentaire de tcedi le 24/05/2006 20:47:04

Etrange, la modification fonctionne comme prévu chez moi !

Peut-être n'ai-je pas été assez clair dans mes explications... Il est également possible que je n'aie pas compris ce que vous vouliez...

Quoi qu'il en soit, j'ai posté une nouvelle version avec les modifications supposées désirées...

Si ce n'est pas encore cela, dites-m'en plus sur votre objectif (exemple concret), cher PaTaTe.

Bonne programmation !

Commentaire de PaTaTe le 25/05/2006 08:55:55

C'est la fonction que je voulait mais apparemment sont comportement est aléatoire.

Commentaire de tcedi le 25/05/2006 11:11:12

Pardonnez-moi, mais le comportement de cette fonction est tout sauf aléatoire !

En mode fichiers vides seulement, elle réalise ceci :

1. Pour chaque dossier, elle génère une liste des dossiers et fichiers que le répertoire contient.

2. Elle traite chaque élément de la liste constituée (pas d'interruption si échec) :

   a. Si c'est un dossier elle s'appelle récursivement pour ce répertoire et effectue le même traitement.

   b. Si c'est un fichier et que celui-ci a une taille de 0 octet, il est supprimé.

Vous pouvez facilement vérifier son fonctionnement :

1. Créez un nouveau dossier.
2. Placez-y des fichiers vides et non-vides.
3. Placez-y des sous-dossiers (Créez-en des nouveaux).
4. Pour chaque sous-dossier, appliquez la même procédure avec des variantes, afin de traiter tous les cas possibles.
5. Effectuez cela jusqu'à obtenir des arborescences de tailles variables de 5 niveaux au moins (sinon c'est trop facile).

ATTENTION : N'y mettez aucune image ou vidéo pour ne pas fausser les résultats ! L'explication de cette remarque vient juste après...

Je suppose que ce que vous entendez par comportement aléatoire, c'est que certains dossiers qui sont pourtant "vides" (j'insiste sur les guillements) ne sont pas supprimés, alors que d'autres ne posent aucun problème !

Si c'est bien le cas, je suppose également qu'à un moment ou à un autre ce dossier a contenu des images et/ou vidéos. Ouvrez l'"Explorateur Windows", Cliquez sur le menu "Outils", puis sur "Options des dossiers...". Allez dans l'onglet "Affichage". Vérifiez dans les "Paramètres avancés" qu'"Afficher les fichiers et dossiers cachés" est bien activé et surtout que "Masquer les fichiers protégés du système d'exploitation (recommandé)" est bien décoché (vous devrez confirmer en cliquant sur "Oui") ! Ouvrez un des dossiers "vide" qui n'a pas été supprimé par la fonction. Vous devriez y voir un fichier "Thumbs.db" qui n'est pas vide. C'est un fichier système caché qui sert à stocker les miniatures sous Windows 2000/XP. Il peut il y en avoir d'autres selon le dossier...

Si un fichier est apparu avec le changement de configuration, il est tout à fait normal que la fonction n'aie pas supprimé le dossier (vu qu'il n'est pas vraiment vide).

Pour pallier à ce problème, vous pouvez évidemment rajouter un test sur le nom du fichier "Thumbs.db".

Voilà,

Sans plus de détails sur ce que vous essayez de supprimer, je ne peux faire plus.

Je ne dis pas qu'il ne peut pas il y avoir de bug (l'erreur est humaine), mais je n'ai pas pu reproduire de phénomène de comportement aléatoire... Peut-être qu'avec plus d'informations, je pourrais reproduire le problème...

Bonne programmation !

Commentaire de PaTaTe le 25/05/2006 12:05:11

Pour le test de la fonction j'ai utilisé un projet effectivement vide et j'ai créé des dossiers et fichiers vides pour tester. Donc je n'etais pas dans un repertoire temporaire sujet à des accès qui pourrait effectivement expliquer le probleme.

Pour les fichiers Thumbs.db, cela n'est pas le problème puisque mise en cache des medias est chez moi tout simplement désactivée donc aucuns de ces fichiers ne peut fausser le déroulement de la fonction.

Commentaire de tcedi le 25/05/2006 12:57:39

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. !

Commentaire de PaTaTe le 25/05/2006 18:40:27

Problème résolu comme indiqué dans le message CS

La fonction tourne correctement. :)

Commentaire de forchi le 03/11/2006 13:48:59

Pour info

Ceux qui sont sous .net:

Dim Dir As New DirectoryInfo("Chemin de mon dossier a supprimer")
Dir.Delete(True)

Commentaire de victor110 le 24/11/2006 18:02:20

On peut aussi utiliser la fonction
DELETE ds VB
Bonne @ prog!!!

Commentaire de alucard02 le 18/12/2007 19:40:58

c'est exactement ce que je cherchais...
Merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Supprimer un répertoire plein de fichiers ! [ par Jonef ] J'aimerais bien pouvoir supprimer un répertoire contenant des fichiers et des sous-répertoires sans avoir à supprimer les sous répertoires un par un.M Suppression de fichiers particulière... [ par andrieuremi ] Bonjour à tous!Quelqu'un connaîtrai-t-il une procédure ou un code VB me permettant de supprimer tout le contenu d'un dossier (fichiers + sous-dossiers Supprimer fichiers .txt d'un répertoire [ par evilmajestik ] Salut tout le monde !Je cherche un petit bout de code pour supprimer tous les fichiers textes dans un r&#233;pertoire pr&#233;cis quelque soit le nomb tous supprimer dans un dossier [ par tonprofde_math ] salut, je veux&nbsp; faire un prog qui supprime les cookies,les fichiesr dans temp,les fichiers dans tempory internet files et l'historique.(j'utilise Supprimer des fichiers dans un répertoire [ par thenonos ] Bonjour, dans le cadre de projet dans&nbsp;mon &#233;cole, je dois cr&#233;er un programme permettant de supprimer des fichiers dans un r&#233;pertoir Supprimer tous les fichiers .txt d'un répertoire à une heure précise [ par gradenko80 ] Bonsoir,Je suis d&#233;butant en VB et je souhaiterais savoir assez rapidement le code que je dois &#233;crire pour supprimer tous les fichiers .txt d supprimer dossier,fichiers [ par mahelan ] Bonjour,J'ai un autre petit soucissi je veut faire supprimer des dossiers ou fichiers,cette commande marcheSet objFSO = CreateObject("Scripting.FileSy Copier fichiers sur CD. [ par Marneus73 ] Bonjour à tousJe voudrais savoir comment faire pour copier un dossier avec tous ses fichiers et sous dossiers vers un autre dossier.Le seul probleme e Nom de fichier [ par wanure ] Bonjour, Je souhaiterai connaître le code qui éxécuterai la chose suivante :Modifier automatiquement les noms de X fichiers se trouvant dans un dossie


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales