PLACARSE
Messages postés2Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention 5 novembre 2007 5 nov. 2007 à 14:24
Dans ce cas, fais l'essai de supprimer un répertoire ayant un grand nombre de sous-répertoires avec ta méthode, puis avec la mienne, et n'oublie surtout pas de nous tenir au courant du résultat ... ;) Ce n'est pas parce que les ordinateurs d'aujourd'hui ont de plus en plus de mémoire qu'ils ont aussi une pile illimitée ! Ce n'est pas la mémoire de ton ordi que tu vas saturer mais LA PILE ! Le gros avantage de ma fonction par rapport à la tienne réside dans le fait que je n'utilise la récursivité QUE POUR DESCENDRE d'un niveau dans l'arborescence des sous-répertoires et, contrairement à ta méthode, cela est indépendant du NOMBRE de sous-répertoires qu'il y a dans le (sous-)répertoire où tu te trouves ! Plus concrêtement, prenons l'exemple suivant : je souhaite supprimer le répertoire "C:\TOTO" qui contient 50.000 (ce n'est qu'un exemple) sous-répertoires, mais tous sont au même niveau, donc directement sous TOTO ... Avec ma méthode, la récursivité n'ira donc pas plus bas que UN niveau (car avant de passer au répertoire suivant, le programme aura dépilé), alors qu'avec ta méthode, tu vas redimensionner un tablau avec une taille de 50.000 ! Là, je doute que ton ordi apprécie la chose ...
D'autre part, ma fonction est destinée à SUPPRIMER une arborescence et non d'en lister le contenu ! Compare donc ce qui est comparable ! Cela dit, si je voulais lister le contenu d'une arborescence, j'aurai sans doute fait un autre code, et je n'aurai pas pour autant utilisé ta fonction car elle ne marchera pas ! Utiliser récursivement la fonction Dir n'est pas une riche idée car c'est une fonction VB qui est GLOBALE à ton projet et non LOCALE à ta fonction ! Alors fais l'essai et tu verras que la liste des fichiers que tu récupèreras sera incomplète ...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 26 juin 2007 à 14:40
plus de Dos sous Vista, mais pas plus ni moins que sous Xp....
coté consommation de la pile, le coté récursif de la chose n'est pas mal non plus :p
d'ici a saturer la mémoire avec un tableau de String, va falloir y aller ^^
PLACARSE
Messages postés2Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention 5 novembre 2007 26 juin 2007 à 14:17
En réponse à SamsonTam, j'aurai 2 petits commentaires à faire :
1- A moins que je n'ai pas compris ce que tu voulais dire, mais, sauf erreur de ma part, ma fonction n'est récurcive QUE si tu lui demandes de supprimer aussi les sous-répertoires en lui passant le dernier paramètre à "True" ... Donc, si tu ne souhaites supprimer QUE LES FICHIERS, je ne vois pas où sera la boucle infinie puisque la fonction n'exécutera pas la partie récurcive !
2- Je n'ai pas testé ton code mais je vois que tu utilises des tableaux que tu redimensionnes dynamiquement ... C'est bien, mais je crois que ton programme aura pas mal de chances de planter dans le cas où tu as beaucoup (pas juste 10 ou 20) de sous-répertoires à supprimer car ta pile risque de ne pas trop aimer ...
En réponse à Renfield, cette fonction a le mérite de fonctionner sous Vista aussi ... Essaie de faire un 'Shell "Cmd ..."' sous Vista sachant qu'il n'y a plus de "DOS" ! ;-)
SamsonTam
Messages postés3Date d'inscriptionsamedi 30 décembre 2006StatutMembreDernière intervention31 décembre 2006 5 janv. 2007 à 14:36
La procédure est fonctionnelle mais seulement dans le cas de suppression du répertoire au complet, je m'explique :
La procédure recommence à lister le répertoire au complet depuis le début après s'avoir appelé elle-même. Donc, ça marche si on supprime tout, mais sinon on entre dans une boucle infinie aussitôt qu'il y a un dossier impossible à supprimer. Car, à chaque fois, la procédure recommencera depuis le début et repassera sur le même répertoire indédiniment.
Do
'ICI <- (La procédure recommence à lister le répertoire depuis le début)
LStrNomFic = Dir(PStrPath & "\*.*", vbDirectory)
While LStrNomFic "." Or LStrNomFic ".." Or (GetAttr(PStrPath & "" & LStrNomFic) And vbDirectory) <> vbDirectory
LStrNomFic = Dir
Wend
If LStrNomFic <> "" And (GetAttr(PStrPath & "" & LStrNomFic) And vbDirectory) = vbDirectory Then
Call DelDir(PStrPath & "" & LStrNomFic)
End If
Loop Until LStrNomFic = ""
Voici un listing qui passera 1 seule fois sur chaque dossier
Private Function GetFilesPaths(ByVal PStrPath As String, ByRef FPathList() As String, _
Optional ByVal SubFolders As Boolean True, Optional Begin As Boolean False)
Dim FPath As String
Static UB As Long
On Error GoTo ExitDelDir
If Begin Then UB = -1
If Right$(PStrPath, 1) "" Then PStrPath Left$(PStrPath, Len(PStrPath) - 1)
' Parcours récursif des sous-répertoires.
If SubFolders Then
FPath = Dir(PStrPath & "\*.*", vbDirectory)
'On lis chaque ficher/répertoire
While FPath <> ""
'On lance la procédure uniquement s'il s'agit d'un répertoire autre que "." et ".."
If FPath <> "." and FPath <> ".." and _
(GetAttr(PStrPath & "" & FPath) And vbDirectory) = vbDirectory Then
GetFilesPaths PStrPath & "" & FPath, FPathList()
End If
FPath = Dir
Wend
End If
5 nov. 2007 à 14:24
D'autre part, ma fonction est destinée à SUPPRIMER une arborescence et non d'en lister le contenu ! Compare donc ce qui est comparable ! Cela dit, si je voulais lister le contenu d'une arborescence, j'aurai sans doute fait un autre code, et je n'aurai pas pour autant utilisé ta fonction car elle ne marchera pas ! Utiliser récursivement la fonction Dir n'est pas une riche idée car c'est une fonction VB qui est GLOBALE à ton projet et non LOCALE à ta fonction ! Alors fais l'essai et tu verras que la liste des fichiers que tu récupèreras sera incomplète ...
26 juin 2007 à 14:40
coté consommation de la pile, le coté récursif de la chose n'est pas mal non plus :p
d'ici a saturer la mémoire avec un tableau de String, va falloir y aller ^^
26 juin 2007 à 14:17
1- A moins que je n'ai pas compris ce que tu voulais dire, mais, sauf erreur de ma part, ma fonction n'est récurcive QUE si tu lui demandes de supprimer aussi les sous-répertoires en lui passant le dernier paramètre à "True" ... Donc, si tu ne souhaites supprimer QUE LES FICHIERS, je ne vois pas où sera la boucle infinie puisque la fonction n'exécutera pas la partie récurcive !
2- Je n'ai pas testé ton code mais je vois que tu utilises des tableaux que tu redimensionnes dynamiquement ... C'est bien, mais je crois que ton programme aura pas mal de chances de planter dans le cas où tu as beaucoup (pas juste 10 ou 20) de sous-répertoires à supprimer car ta pile risque de ne pas trop aimer ...
En réponse à Renfield, cette fonction a le mérite de fonctionner sous Vista aussi ... Essaie de faire un 'Shell "Cmd ..."' sous Vista sachant qu'il n'y a plus de "DOS" ! ;-)
5 janv. 2007 à 14:36
La procédure recommence à lister le répertoire au complet depuis le début après s'avoir appelé elle-même. Donc, ça marche si on supprime tout, mais sinon on entre dans une boucle infinie aussitôt qu'il y a un dossier impossible à supprimer. Car, à chaque fois, la procédure recommencera depuis le début et repassera sur le même répertoire indédiniment.
Do
'ICI <- (La procédure recommence à lister le répertoire depuis le début)
LStrNomFic = Dir(PStrPath & "\*.*", vbDirectory)
While LStrNomFic "." Or LStrNomFic ".." Or (GetAttr(PStrPath & "" & LStrNomFic) And vbDirectory) <> vbDirectory
LStrNomFic = Dir
Wend
If LStrNomFic <> "" And (GetAttr(PStrPath & "" & LStrNomFic) And vbDirectory) = vbDirectory Then
Call DelDir(PStrPath & "" & LStrNomFic)
End If
Loop Until LStrNomFic = ""
Voici un listing qui passera 1 seule fois sur chaque dossier
Private Function GetFilesPaths(ByVal PStrPath As String, ByRef FPathList() As String, _
Optional ByVal SubFolders As Boolean True, Optional Begin As Boolean False)
Dim FPath As String
Static UB As Long
On Error GoTo ExitDelDir
If Begin Then UB = -1
If Right$(PStrPath, 1) "" Then PStrPath Left$(PStrPath, Len(PStrPath) - 1)
' Parcours récursif des sous-répertoires.
If SubFolders Then
FPath = Dir(PStrPath & "\*.*", vbDirectory)
'On lis chaque ficher/répertoire
While FPath <> ""
'On lance la procédure uniquement s'il s'agit d'un répertoire autre que "." et ".."
If FPath <> "." and FPath <> ".." and _
(GetAttr(PStrPath & "" & FPath) And vbDirectory) = vbDirectory Then
GetFilesPaths PStrPath & "" & FPath, FPathList()
End If
FPath = Dir
Wend
End If
FPath = Dir(PStrPath & "\*.*")
While FPath <> ""
UB = UB + 1
ReDim Preserve FPathList(UB)
FPathList(UB) = App.Path & "" & FPath
FPath = Dir
Wend
ExitDelDir:
DoEvents
End Function
Sinon c'est utile.
25 août 2006 à 14:07
grâce à toi j'ai pu résoudre mon problème et surtout mieux comprendre
le méchanisme.
je ne peux que noter 10
14 avril 2006 à 11:30
Très bien
MErci
8 nov. 2004 à 16:40
Je vais simplement la modifier pour gerer les erreurs (si le fichier a supprimer est occupé.
L'idée est pour supprimer les temp files des utilisateurs.
la methode rmdir s'arrete s'il rencontre un fichier qu'il ne peut supprimer. Laissant tout les autres fichiers en place.
Merci pour le code ! !
8 nov. 2004 à 16:14
shell "cmd /c rmdir " & FolderPath & " /Q/S"
et voilà : sans API ni SystemObject ;-)
8 nov. 2004 à 16:09
on pourrait imaginer un paramètre optionnel supplémentaire pour saisir un filtre (*.*)
(on dit récursif, pas récurcif)