XL 2010 Récurssivité non fonctionnelle

Mina12

XLDnaute Nouveau
Bonjour, j'ai un programme qui permet de renommer les dossiers et sous dossiers d'un répertoire. Malheureusement la récurssivité pour changer le nom de mes sous dossiers ne fonctionne pas. Le programme en lui même est juste, pas de messages d'erreurs donc je n'arrive pas à trouver d'où vient le problème. Si quelqun a une solution.
Merci d'avance!

VB:
Sub Rename()
 Dim dossier As String
    dossier = "P:\Test\"
    
    'Appelle la procédure de recherche des fichiers
     rech_fichier dossier
 
    
    MsgBox "Terminé"
    
End Sub




Sub rech_fichier(repertoire As String)


    Dim RegEx As VBScript_RegExp_55.RegExp
    Dim Matches As VBScript_RegExp_55.MatchCollection
    Dim Match As VBScript_RegExp_55.Match
    Dim Filename As String
    Dim Result As String
    Dim Temp As String
 
    Dim Fso As Scripting.FileSystemObject
    Dim SourceFolder As Scripting.Folder
    Dim SubFolder As Scripting.Folder
    Dim FileItem As Scripting.File


    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = Fso.GetFolder(repertoire)
 
    For Each FileItem In SourceFolder.Files
    
        Set RegEx = New VBScript_RegExp_55.RegExp
        Filename = Dir(repertoire & "*.*")
        Do While Filename <> ""
             Temp = Replace(Filename, "-", "_")
             RegEx.Pattern = "^(.+)(_V[0-9]+)\.(.+)$" ' Teste si le nom est formalisé
             If Not RegEx.Test(Temp) Then
               RegEx.Pattern = "^([^0-9|\.|_]+)_*([0-9]*)\.(.+)$" ' Découpe le nom pour récupérer les parties à réassembler en excluant le underscore
               Set Matches = RegEx.Execute(Temp)
               If (Matches(0).SubMatches(1)) = "" Then
                 Result = repertoire & RegEx.Replace(Temp, "$1_V1.$3") ' réassemble avec les morceaux trouvés et V1 car pas de numérotation
               Else
                 Result = repertoire & RegEx.Replace(Temp, "$1_V$2.$3") ' Réassemble les morceaux en insérant le _V
               End If
            Else
               Result = repertoire & Temp
            End If
            
            Name repertoire & Filename As Result
            Filename = Dir()
        Loop
        
    Next FileItem
 
    '--- Appel récursif pour lister les fichier dans les sous-répertoires ---.
    For Each SubFolder In SourceFolder.SubFolders
        rech_fichier SubFolder.path
    Next SubFolder
    
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonsoir
Vous mélanger les Dir et les explorations par FSO ?
Cherchez plutôt une structure de ce genre :
VB:
Sub Rename()
   Dim FSO As New FileSystemObject
   RechFichiers FSO.GetFolder("P:\Test")
   End Sub
Private Sub RechFichiers(ByVal Fdr As Scripting.Folder)
   Dim FileItem As Scripting.File, SubFolder As Scripting.Folder, _
        …
   For Each FileItem In Fdr.Files
      Filename = FileItem.Name
      …
      …
      FileItem.Name = ???
      Next FileItem
   For Each SubFolder In Fdr.SubFolders
      RechFichiers SubFolder
      Next SubFolder
   End Sub
 

patricktoulon

XLDnaute Barbatruc
bonsoir
Le programme en lui même est juste, pas de messages d'erreurs donc je n'arrive pas à trouver d'où vient le problème.
et ben non!!!!!
raisonnement erroné

on ne peut pas renommer des dossiers sous dossier en mode récursif c'est pas possible

imagine tu tombe sur un dossier tu le renomme dans ta boucle et fait un appel recursif pour descendre dans l'arborescence il est bien évident que le dossier précédemment trouver dans l'instance de la fonction est inexistant puisqu'il porte un autre nom
tu imagine bien que quand tu change un nom de dossier tu change aussi le chemin de tout ses descendants

le renommage en masse nécessite de commencer par le dernier descendant pour remonter vers le premier parent mais il faut stocker les chemins de l’arborescence dans son ensemble avant !!!!

Alors non!! ton programme n'est pas juste et loin de le l’être même
 

patricktoulon

XLDnaute Barbatruc
re
exact @Dranreb
a la limite (et encore je sais pas ce que répondrait le lastmodified de FSO
ce qu'il faut c'est boucler et avec un if sur le last modified changer le nom mais le nombre d' appels récursifs seraient certainement décuplé
on boucle on sur boucle les subfolder jusqu’à que l'on trouve un lastmodified n'ayant pas la date du jour
et on repars de zéro
mais bon c'est jouer a la roulette russe y a la balle ou y a pas la balle 🤣 🤣
 

patricktoulon

XLDnaute Barbatruc
re
c'est pas bien grave ça ( la méthode de changement de nom)
l'essentiel a retenir c'est que l'appel récursif suivant ne trouvera pas le chemin puisque le parent a été changé dans l'appel récursif précédent

d'autant plus quand on lit bien le code dans l'exemple donné en post 1 ça ne reflète pas la demande
il renomme les fichiers et non les dossiers ce qui n'est pas la même chose
les fichiers n'ont pas de descendants
 

Dranreb

XLDnaute Barbatruc
C'est pour ça qu'à part pour définir le dossier racine, il ne faut jamais chercher de chemin nulle part, et seulement explorer l'arborescence.
@Mina12, Vous chercher à renommer quoi comment au juste ? (je ne sais pas lire le RegExp)
 
Dernière édition:

Mina12

XLDnaute Nouveau
Bonjour, merci pour vos conseils. Je débute à peine donc il y a certaines choses que je ne comprends pas bien.
pour le renommage, ce sont des fichiers qui peuvent avoir des noms différents qui vont être formatés. Par exemple si le fichier s appelle Bonjour-1234 il programme va l appeller Bonjour_V1234. Ce programme est juste c est au moment où j ai ajouter la récursivité pour la lecture des sous dossiers que ça ne marchait plus ducoup.
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour le fil, le forum

@Mina12 si votre programme fonctionne pour le renommage des fichiers, le plus simple serait certainement, pour éviter tout problème, de stocker les informations d'anciens et de nouveaux fullname dans un tableau string à deux dimensions.
Une fois la recherche finie, une simple boucle de replace sur le tableau effectuerait toutes les opérations de renommage de fichiers sans conflit possible.
Pour traiter des dossiers aussi, il suffirait d'appliquer le renommage en descendant le tableau (pour conserver les noms des dossiers originels pendant le traitement) pour partir de la fin d'arborescence et finir au début, avec certainement un Doevents intercalé pour s'assurer que chaque opération de renommage de dossier enfant a bien été traitée et cloturée avant de passer à la suivante pour un dossier parent.

Bien cordialement, @+
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Enfin chez moi en essayant de traiter "Bonjour-1234" dans une petite Sub de test où j'ai tout reproduit du code indiqué au début faisant du RegExp, l'instruction If (Matches(0).SubMatches(1)) = "" Then plante: Erreur 5: Argument ou appel de procédure incorrect.
 

Discussions similaires

Statistiques des forums

Discussions
314 492
Messages
2 110 191
Membres
110 696
dernier inscrit
GUI42380