[R] Suppression d'un répertoire et de son contenu

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
peuchere83
Niveau 5
Niveau 5
Messages : 169
Enregistré le : mer. 17 déc. 2008 10:50
Status : Hors ligne

[R] Suppression d'un répertoire et de son contenu

#1

Message par peuchere83 »

Bonjour à tous,

Je suis en train de m'arracher les cheveux sur une pauvre boucle :evil:
Je cherche à supprimer un répertoire ainsi que son contenu dans une arborescence. Ne sachant pas ou se trouve ce répertoire, j'utilise une boucle de recherche récursive sur les répertoires et je compare le dernier élément(répertoire retourné par ma fonction GetElementName) contenu dans la valeur retournée par mon tableau au nom de mon répertoire à supprimer.
(J'espère avoir été assez clair :P ).

Voici mon code :

Code : Tout sélectionner

$a_Array = _FileListToArrayXT ($s_RepLocal, "*", 2, 2, True)
$s_RepLocal = "F:\RepLocal"
$RepaSupprimer = "TOTO"

For $i=$a_Array[0] To 1 Step -1
    If GetElementName($a_Array[$i],0) = $RepaSupprimer  Then    ; on recherche le répertoire "TOTO" pour supprimer son contenu
        $ResultRemove = DirRemove($a_Array[$i], 1)
        If $ResultRemove = 1 Then
            MsgBox(0,"", "suppression ok")
            ExitLoop
        Else
            MsgBox(0,"", "suppression erreur")
            ExitLoop
        EndIf
    EndIf
Next

; #FUNCTION# ====================================================================================================================
; Name...........:  GetElementName
; Description ...:  Récupération d'un élément (répertoire ou  fichier) dans le chemin passé en paramètre
; Syntax.........:  GetElementName($PpathFile, $PdirPlace)
; Parameters ....:  $PpathFile              - Chemin du fichier complet
;                   $PdirPlace              - Position de l'élement à récupérer
;                                           - Le dernier répertoire représente (celui qui contient le fichier) le niveau 1 (0 étant le fichier)
; Return values .: Success                  - Retourne le nom de l'élément à la position spécifiée
;                  Failure                  - Retourne 0
; Author ........: J. COTTA (peuchere83)
; ===============================================================================================================================   
Func GetElementName($PpathFile, $PdirPlace)
    $a_DirName = StringSplit($PpathFile, "\")
    If $PdirPlace > $a_DirName[0] Then
        Return 0
    Else
        Return($a_DirName[$a_DirName[0] - $PdirPlace])
    EndIf
EndFunc
Mon problème est le suivant :
Je n'arrive pas à supprimer ce $#!!%$# de répertoire : le dirremove me retourne systématiquement le code 0.

Quelqu'un a t'il une idée ?

Par avance merci.
Modifié en dernier par peuchere83 le lun. 16 août 2010 08:48, modifié 2 fois.
Tous biens que tu possèdes est un souci qui te retient.
Skippy est là pour t'enlever tous tes soucis.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#2

Message par Tlem »

En fait, je pense que votre problème vient de la fonction GetElementName.

Puisque vous ne précisez pas la position du dossier TOTO, je suppose que cela peut être n'importe quel sous répertoire ...

Donc pour cela il vaut mieux tester la présence d'un dossier TOTO dans la chaine du répertoire.
Comme vous ne précisez pas si c'est sur le nom entier ou une partie du nom, nous allons considérer qu'il faut que ce soit un dossier dont le nom soit exactement TOTO.

Donc :
- C:\Dossier 1\TOTO est correct.
- C:\Dossier 3\Dossier 4\TOTO est correct.
- C:\Dossier 5\TOTO ET TITI est incorrect.
On fait bien évidemment abstraction des dossiers du genre :
- C:\Dossier 6\TOTO\Dossier 7
puisque dans la liste nous finirons pas obtenir :
- C:\Dossier 6\TOTO

Deux solutions sont envisageable :
- 1 : On prend pour exemple la chaine C:\Dossier 1\TOTO et on vérifie si les cinq derniers caractères sont égales à la chaine \TOTO.

Code : Tout sélectionner

$String = "C:\Dossier 1\TOTO"
$Dossier = "TOTO"

If StringRight($String, 5) = '\' & $Dossier Then
    MsgBox(0, "", "C'est un dossier TOTO")
EndIf
- 2 : On utilise l'expression régulière pour faire comme ci-dessus.

Code : Tout sélectionner

$String = "C:\Dossier 1\TOTO"
$Dossier = "TOTO"

If StringRegExp($String, '\\' & $Dossier & '\b', 0) Then
    MsgBox(0, "", "C'est un dossier TOTO")
EndIf
En ce qui concerne le DirRemove, il y a plusieurs choses à prendre en compte.
1 - Il ce peut qu'il ne soit pas instantané.
2 - Certains sous dossiers peuvent être protégés contre l'effacement.
3 - Certains fichiers de ce dossiers peuvent êtres verrouillés.
Ce qui implique une erreur sur la condition de test de l'effacement.

Voilà. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
peuchere83
Niveau 5
Niveau 5
Messages : 169
Enregistré le : mer. 17 déc. 2008 10:50
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#3

Message par peuchere83 »

Merci pour ta réponse Tlem.

Mais le problème ne vient pas de la fonction GetElementName.
En effet elle me retourne le dernier répertoire (dans mon cas) contenu dans le chemin qui lui est passé en paramètre.
Ainsi la ligne :

Code : Tout sélectionner

If GetElementName($a_Array[$i],0) = $RepaSupprimer  Then
test si le dernier répertoire contenu dans le chemin lu dans le tableau est égal au répertoire que je cherche à supprimer.
Ce qui correspond en fait à vos 2 propositions.

Non, le problème vient bien du dirremove et de la boucle for :

Code : Tout sélectionner

DirRemove($s_RepLocal & "\....\" & $RepaSupprimer , 1)
Ceci fonctionne très bien. Par contre cela ne fonctionne plus dès que je suis dans la boucle : le répertoire est verrouillé et je ne peux même pas le supprimer manuellement sous l'explorateur Windows durant l'exécution du script (j'ouvre un msgbox pour faire ce test).

Je vais continuer mes tests. Si quelqu'un a une idée, je suis preneur bien sur.
Bonne journée à tous.
Tous biens que tu possèdes est un souci qui te retient.
Skippy est là pour t'enlever tous tes soucis.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#4

Message par Tlem »

Dans ce cas, stockez le nom et le chemin des dossiers dans une autre variable, puis après votre boucle de lecture, faites une boucle de suppression. ;)
Si c'est vraiment votre script qui bloque le dossier, alors passez par un BATCH temporaire que vous lancerez à la fermeture de votre script.

Encore une dernière solution :
- Mettre le DirRemove dans une boucle tant que le dossier existe.
Mais dans ce cas, il faut gérer une temporisation afin de ne pas bloquer le script si le dossier ne peut vraiment pas être supprimé ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
peuchere83
Niveau 5
Niveau 5
Messages : 169
Enregistré le : mer. 17 déc. 2008 10:50
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#5

Message par peuchere83 »

Après de nombreux essais non concluant (incluant ceux proposés par Tlem) je me suis rendu compte d'une chose :
La suppression de répertoire semble ne pas fonctionner lorsqu'elle est utilisée dans une boucle for en sortie d'un filelisttoarray.

Par contre si j'utilise FileFindNextFile pour le rechercher, je n'ai aucun problème à la suppression.

Quelqu'un a t'il déjà remarqué cela ?

Ou est ce moi qui suis vraiment fatigué ?
Tous biens que tu possèdes est un souci qui te retient.
Skippy est là pour t'enlever tous tes soucis.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#6

Message par Tlem »

Dans ce sujet : http://www.autoitscript.fr/forum/viewto ... f=21&t=479
il y a deux autre fonctions pour lister les fichiers d'un dossier.
Essayez-les ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
peuchere83
Niveau 5
Niveau 5
Messages : 169
Enregistré le : mer. 17 déc. 2008 10:50
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#7

Message par peuchere83 »

Merci Tlem,

J'ai déjà essayé ces 2 fonctions et cela ne change rien.
En fait ma suppression de répertoire échoue quand je fais un traitement récursif.
Je ne comprends pas pourquoi car cela marche parfaitement pour la suppression de fichiers. :shock:

Pourtant je parcours mon tableau depuis la fin justement pour éviter ce problème.

Là, je sèche vraiment.
Tous biens que tu possèdes est un souci qui te retient.
Skippy est là pour t'enlever tous tes soucis.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#8

Message par Tlem »

Difficile de vous répondre, car je n'ai pas ce type de problème.
Essayez de faire une pause de cinq secondes après le _FileListToArrayXT, ou alors utilisez la commande BATCH Del /F /S au lieu du DirRemove.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
peuchere83
Niveau 5
Niveau 5
Messages : 169
Enregistré le : mer. 17 déc. 2008 10:50
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#9

Message par peuchere83 »

Si je comprends bien mon code fonctionne bien chez vous ou avez vous votre propre script de suppression de répertoire dans une arborescence ?

Dans le 1er cas, je vais modifier mon script pour que la suppression se sans utiliser un filelisttoarray et sans récursivité; dans le 2ème cas, pourriez m'envoyer votre code afin que je comprenne d'où vient mon erreur.

Voici la dernière version de mon script :
► Afficher le texte
Pour information ma structure de répertoire de test ressemble à celle-ci :
F:\test\TOTO
F:\test\TATA
F:\test\TUTU\TOTO
F:\test\TETE\TOTO

J'espère que grâce à ces informations, quelqu'un va pouvoir me sortir de mon incompréhension totale.

Encore merci à tous.
Tous biens que tu possèdes est un souci qui te retient.
Skippy est là pour t'enlever tous tes soucis.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#10

Message par Tlem »

Bon, après de laborieuses recherches, je suis arrivé à la conclusion que ce sont les fonctions de recherches récursives testées qui bloque la suppression des dossiers.
Même un RMDIR /S /Q n'en vient pas à bout !!!

Trouvant cela étrange, j'ai repris le fil du sujet à l'origine de la fonction _FileListToArrayXT et j'y ai retrouvé pas mal de code divers.
J'ai essayé pratiquement toutes les fonctions et je suis arrivé à un code fonctionnel (sur mon PC) :
► Afficher le texte
Je vais donc rajouter cette fonction dans le fil de discussion lié au recherches de fichiers. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
peuchere83
Niveau 5
Niveau 5
Messages : 169
Enregistré le : mer. 17 déc. 2008 10:50
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#11

Message par peuchere83 »

Deux grands merci Tlem :

- le 1er : pour le code (j'aurais du penser à regarder le forum anglais, je n'ai pas encore le réflexe, je suis trop c..)
- le 2ème : pour me confirmer que je ne suis pas fou !!! :lol:
En effet je suis tombé sur la même conclusion que toi (récursivité : suppression seulement à la 2ème exécution).

Je m'étonne quand même que personne (sur ce forum) ne soit déjà tombé sur ce problème.

Encore un grand merci.
Tous biens que tu possèdes est un souci qui te retient.
Skippy est là pour t'enlever tous tes soucis.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Suppression d'un répertoire et de son contenu

#12

Message par Tlem »

peuchere83 a écrit :Je m'étonne quand même que personne (sur ce forum) ne soit déjà tombé sur ce problème.
Surement par que personne n'a cherché à supprimé des répertoires ...

Dés que j'ai un moment, je rajouterais cette remarque sur le forum Anglais dans le sujet lié à cette fonction.
Cela-dit, _FileListToArrayNT m'a tout l'ai de fonctionner aussi bien. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
peuchere83
Niveau 5
Niveau 5
Messages : 169
Enregistré le : mer. 17 déc. 2008 10:50
Status : Hors ligne

Re: [R] Suppression d'un répertoire et de son contenu

#13

Message par peuchere83 »

Donc je viens de remplacer toutes mes boucles de traitement de dossiers avec cette fonction et cela marche du tonnerre.

Par contre tu as commis quelques erreurs à ce sujet dans ta mise à jour dans la partie UDF :
Tlem a écrit :Comme vous pouvez le constater, cette fonction est similaire à la fonction _FileListToArrayNT sans le paramètre du format de retour des dossiers.
Ce n'est pas _FileListToArrayNT mais _FileListToArrayXT (bon la je chipote :P )
Par contre le paramètre du format de retour existe bien : $iPathType

Donc elle fonctionne exactement comme _FileListToArrayXT (avec la suppression de répertoire en plus).

Petite remarque quand même toujours sur le traitement récursif mais cette fois sur des fichiers :
Si on lance une recherche récursive uniquement sur des fichiers (peut importe l'extension) et que le chemin de recherche est court, pas de problème, un tableau est retourné (Ex de chemin de recherche : F:\Répertoire).
Par contre si ce chemin est plus long (Ex F:\Répertoire\Répertoire2\Répertoire3) la fonction échoue !!! :mrgreen:
Ce qui empêche de cibler notre recherche.

Et cela se vérifie sur les 4 fonctions proposées dans la partie UDF du forum.
Pour corriger cela je pense qu'il faut changer le path de travail de l'application.

Bonne journée et encore merci.
Tous biens que tu possèdes est un souci qui te retient.
Skippy est là pour t'enlever tous tes soucis.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Suppression d'un répertoire et de son contenu

#14

Message par Tlem »

Mes deux erreurs ont été corrigées.
Merci beaucoup.

Par contre, vous devez sans doute en faire une, car j'ai essayé la fonction sur Documents and Settings à la recherche de fichiers *.txt et je n'ai eu aucun problème.
Il m'a trouvé des fichiers d'un sous-dossier de dixième niveau ...

Code : Tout sélectionner

[24]|C:\Documents and Settings\Tlem\Application Data\Mozilla\Firefox\Profiles\l9q0wh8l.default\extensions\en-US@dictionaries.addons.mozilla.org\dictionaries\README-en-US.txt
 
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre