2014-05-25 1 views
1

Scénario - OutFolder contient des fichiers XML qui sont nommés par leurs datetime créés (comme 20140524110115, 20140524110120, 20140524110122 et ainsi de suite). Je souhaite renommer ces fichiers en fonction de leur ID et de leur valeur Action (et vérifier également les doublons).Le fichier FSO renommer le code en cours d'exécution deux fois

Problème - Lorsque j'exécute le code suivant, la boucle s'exécute deux fois plus de fois que le nombre de fichiers dans le dossier. Actuellement, le dossier contient 67 fichiers et la boucle est exécutée 134 fois. Par conséquent, les fichiers sont renommés comme

 
ID11_New_2.xml 
ID11_Used_2.xml 
ID12_New_2.xml 
ID12_Sold_2.xml 
... and so on 

Je me attendais

 
ID11_New_1.xml 
ID11_Used_1.xml 
ID12_New_1.xml 
ID12_Sold_1.xml 
... and so on 

Pourquoi la boucle est en cours d'exécution deux fois?

Sub Test(OutFolder) 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set xmlDoc = CreateObject("Microsoft.XMLDOM") 
    xmlDoc.SetProperty "SelectionLanguage", "XPath" 
    xmlDoc.Async = False 
    Set objFiles = objFSO.GetFolder(OutFolder).Files 
    i = 1 

    For Each FileXML In objFiles 
     Debug.Print i 
     xmlDoc.Load (FileXML.Path) 
     Set varID = xmlDoc.GetElementsByTagName("Id") 
     Set varAction = xmlDoc.GetElementsByTagName("Action") 
     If varID.Length > 0 And varAction.Length > 0 Then 'if file is of correct format 
      FileCtr = 1 
      varFileName = varID(0).Text & "_" & varAction(0).Text & "_" & FileCtr & ".xml" 
      'check for duplicates 
      While objFSO.FileExists(objFSO.BuildPath(OutFolder, varFileName)) 
       varFileName = varID(0).Text & "_" & varAction(0).Text & "_" & FileCtr & ".xml" 
       FileCtr = FileCtr + 1 
      Wend 
      'FileXML.Name = varFileName 
      With objFSO 
       .MoveFile .BuildPath(FileXML.ParentFolder, FileXML.Name), .BuildPath(FileXML.ParentFolder, varFileName) 
      End With 
     End If 
     i = i + 1 
    Next 
End Sub 
+1

C'est une bonne règle générale de ne pas modifier le contenu d'un ensemble d'objets tout en faisant des itérations sur ceux-ci. Placez d'abord les noms des fichiers sources dans une collection, puis traitez-les. –

Répondre

0
While objFSO.FileExists(objFSO.BuildPath(OutFolder, varFileName)) 
    FileCtr = FileCtr + 1 
    varFileName = varID(0).Text & "_" & varAction(0).Text & "_" & FileCtr & ".xml" 
Wend 

Et pas vraiment sûr si le dossier dans lequel vous testez des doublons est correcte (je ne sais pas ce que les dossiers contiennent), mais peut-être en première ligne ther vous devez changer avec OutFolderFileXML.ParentFolder

+0

N'a pas fonctionné ... obtenant toujours le même résultat. 134 boucles et fichiers avec _2 noms. Avant d'exécuter la macro, le dossier contient les fichiers avec datetime en tant que noms. J'espère renommer ces fichiers en fonction de leur contenu (ID et action) dans le même dossier. Donc, OutFolder est FileXML.ParentFolder. –

+1

@PankajJaju, comme les dossiers d'entrée et de sortie sont les mêmes, et que la collection '.Files' n'est pas statique (c'est-à-dire que vous renommez les fichiers qu'ils sont inclus dans la collection), vous retraitez les fichiers. Donc, utilisez des dossiers différents ou vérifiez si le fichier a été renommé. –