[R] Supprimer tout le contenu d'un répertoire

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
abdel792
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 27 juin 2009 13:28
Status : Hors ligne

[R] Supprimer tout le contenu d'un répertoire

#1

Message par abdel792 »

Bonjour le forum,

Voilà, je recherche une méthode pour supprimer tout le contenu d'un répertoire, tout en conservant la structure de ce dernier.

J'ai trouvé dans l'aide de AutoIt les fonctions DirRemove et FileDelete mais la première supprime aussi la structure du répertoire à vider et la seconde ne supprime que les fichiers contenus dans le répertoire à vider.

Quelqu'un pourrait t-il m'aider à concevoir un script qui ferait cela avec AutoIt?

Je vous remercie d'avance.

Amicalement.
Modifié en dernier par abdel792 le lun. 21 mars 2011 08:59, modifié 1 fois.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supprimer tout le contenu d'un répertoire

#2

Message par Iste »

Si j'ai bien compris, vous voudriez supprimer tout les fichier d'un dossier et de ses sous dossier, mais pas les dossiers ?
Le plus simple est une approche récursive selon moi.
Voici un petit exemple utilisant une variante de _FileListToArray()

Code : Tout sélectionner

cleanDir("C:\Users\Iste\Desktop\test del")

Func cleanDir(Const $dir)
    Local Const $files = _FileListToArray($dir)
    For $file In $files
        If StringInStr(FileGetAttrib($dir & '\' & $file), 'D') <> 0 Then
            cleanDir($dir & '\' & $file)
        Else
            FileDelete($dir & '\' & $file)
        EndIf
    Next
EndFunc

Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
    Local $hSearch, $sFile, $sFileList, $sDelim = "|"
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
    $hSearch = FileFindFirstFile($sPath & $sFilter)
    If @error Then Return SetError(4, 4, "")
    While 1
        $sFile = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        If ($iFlag + @extended = 2) Then ContinueLoop
        $sFileList &= $sDelim & $sFile
    WEnd
    FileClose($hSearch)
    If Not $sFileList Then Return SetError(4, 4, "")
    Return StringSplit(StringTrimLeft($sFileList, 1), "|", 2)
EndFunc;==>_FileListToArray
Signez ici
abdel792
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 27 juin 2009 13:28
Status : Hors ligne

Re: [..] Supprimer tout le contenu d'un répertoire

#3

Message par abdel792 »

Bonsoirr,

Tout d'abord, je vous remercie pour cette réponse rapide.

En fait, mon but ce serait de supprimer tout le contenu d'un répertoire donné, fichiers et sous-dossiers confondus.

Cependant, je souhaiterais que le répertoire lui même soit conservé, je ne veux vider que son contenu.

Je vais essayer la solution que vous me suggérez là et je vous tiendrai au courant si ca a bien marché.

Amicalement.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Supprimer tout le contenu d'un répertoire

#4

Message par matwachich »

Code : Tout sélectionner

DirRemove("dossier", 1)
DirCreate("dossier")
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supprimer tout le contenu d'un répertoire

#5

Message par Iste »

Ha bah dans ce cas c'est tres simple en effet ^^

matwachich, c'est un peu de la triche ca :p surtout si le dossier est verrouillé

Du coup, dans l'exemple que je vous ai passé, dans la boucle for, il suffit de laisser que le "FileDelete($dir & '\' & $file)" et hop, tout sera supprimé !
cela ne justifie par contre pas une modif de _FileListToArray()
(j'avais rajouté le flag 2 sur le Return StringSplit() pour pouvoir faire un foreach)

regardez la doc du coté de FileFindNextFile() pour comprendre comment le faire vous meme.
Signez ici
abdel792
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 27 juin 2009 13:28
Status : Hors ligne

Re: [..] Supprimer tout le contenu d'un répertoire

#6

Message par abdel792 »

Bonsoir,

Je suis tout à fait d'accord avec vous, par rapport à la suppression puis la recréation du dossier car ca pose effectivement problème lorsque le répertoire en question est verrouillé ou protégé.

Cependant, je n'ai toujours pas pu appliquer le script que vous me suggérez, car j'ai un message d'erreur à son exécution.

Le message d'erreur désigne la ligne suivante :

Code : Tout sélectionner

For $file In $files
Cette ligne figure dans la fonction CleanDir et voici le texte du message d'erreur :

Error: Variable must be of type "Object".

Etant débutant dans le domaine, je n'ai pas trop compris la signification de ce message d'erreur.

Pour info, j'ai inclu les deux fonctions CleanDir et _FileListToArray dans le script en question.

Je tourne avec la version 3.3.6.1 de AutoIt et suis sous Windows XP familial.

Amicalement.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Supprimer tout le contenu d'un répertoire

#7

Message par Iste »

Code : Tout sélectionner

For $file In $files
va effectuer une boucle sur tout les éléments de $files et nommer l'élément de l'itération actuelle $file.
Votre message d'erreur signifie que chez vous, $files n'était pas un objet, qu'il était pas itérable.

Pour éviter tout problème, utiliser la fonction _FileListToArray() non modifiée, et faire un

Code : Tout sélectionner

For $i = 1 To $files[0]
Signez ici
abdel792
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 27 juin 2009 13:28
Status : Hors ligne

Re: [..] Supprimer tout le contenu d'un répertoire

#8

Message par abdel792 »

Bonjour,

Effectivement, en utilisant la version originale de la fonction _FileListToArray que j'ai trouvé dans les archives du forum, j'ai pu vider tout le contenu d'un dossier nommé "Le dossier" et figurant dans le répertoire ou figure le script.

Pour Ce faire, j'ai du apporté une toute petite modification à la fonction CleanDir que m'a suggéré Iste, que je remercie au passage.

J'ai du également introduire la version non-modifiée de la fonction _FileListToArray dans un fichier et l'inclure dans l'entête du script.

Voici le code qui fonctionne à merveille désormais :

Code : Tout sélectionner

#include "FileListToArray.au3"

;~ cleanDir(@ScriptDir & "\Le dossier")

;~ Func cleanDir(Const $dir)
;~  local $file
;~     Local Const $files = _FileListToArray($dir, "*", 0)
;~     For $file In $files
;~      DirRemove($dir & '\' & $file, 1)
;~                        FileDelete($dir & '\' & $file)
;~             Next
;~ EndFunc
Amicalement.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [R] Supprimer tout le contenu d'un répertoire

#9

Message par Iste »

Pas besoin d'aller chercher si loin, la fonction se trouve dans l'udf File.au3 que vous devriez normalement trouver avec les autres udf fourni avec autoit.

Code : Tout sélectionner

#Include <File.au3>
devrait donc aller.
Pensez aussi à regarder dans la partie User Defined Functions Reference de la doc
Signez ici
Répondre