Newsgroup: it.comp.lang.visual-basic
Titolo: Ciclo For Each... all'indietro.

Sto ciclando delle dir e relative sub dir con questo:
    Dim oSub As Folder
    For Each oSub In oFolder.SubFolders
        If oSub.SubFolders.Count = 0 Then
            If oSub.Files.Count = 0 Then
                oSub.Delete
            End If
        Else
            Call RecurseFolders(oSub)
        End If
    Next oSub
Mettiamo d'avere un albero di dir con 2 dir principali e diverse sottodir 
tipo:
1 - 1.1 - 1.2 - 1.3
2 - 2.1
Il codice di cui sopra cicla partendo dalla 1, poi va alla 1.1, quindi passa 
alla 1.2, 1.3 per poi continuare con la dir 2 e le sue sottodir.
Mi servirebbe procedere a ritroso, cioč che partisse dalla 2.1 poi alla 2 
poi alla 1.3 etc....
E possibile farlo?

 ha scritto nel messaggio 
news:4909edee$0$14490$5fc...@news.tiscali.it...

con ciclo each non so ma sicuramente for next si con step -1


Serve una cosiddetta "visita postorder" dell'albero delle directory, ossia 
prima ciascuna subfolder e poi la root folder.
Dovrebbe bastare un For classico a discendere e cambiare un po' l'ordine di 
esecuzione delle istruzioni contenute nel loop:
Scrivo a braccio, senza provare:
Sub RecurseFolders(oFolder As Folder)
    Dim oSub As Folder
    Dim i as Integer
    For i = oFolder.SubFolders.Count To 1 Step -1
        Set oSub = oFolder.SubFolders(i)
        Call RecurseFolders(oSub)
        If oSub.SubFolders.Count = 0 Then
            If oSub.Files.Count = 0 Then
                oSub.Delete
            End If
        End If
    Next
End Sub
In tal modo l'ordine di visita delle varie folder dovrebbe proprio essere 
quello desiderato.
Bye
Raf 

 quello desiderato.
Ti ringrazio... ma ricevo un "chiamata di routine o argomento non valido" 
alla riga Set oSub = oFolder.SubFolders(i)
...sto cercando di capire il perchč... ma non sono un programmatore e si 
vede... :-) 


Ho idea che, contrariamente a quello che pensavo, la collection SubFolders 
non si possa iterare per indice (for next classico), ma solo con un for 
each.
Quindi, a meno di non utilizzare un'altra collection di appoggio per 
travasare gli elementi di SubFolders per poi enumerarli nell'ordine 
desiderato, le subfolder non possono essere processate in ordine inverso... 
ma non penso che sia un problema, se ho capito bene stai facendo una routine 
di "pulizia" delle cartelle vuote e quindi non credo che sia rilevante 
l'ordine in cui vengono processate le subfolder di una stessa folder.
    Dim oSub As Folder
    For Each oSub In oFolder.SubFolders
        Call RecurseFolders(oSub)
        If oSub.SubFolders.Count = 0 Then
            If oSub.Files.Count = 0 Then
                oSub.Delete
            End If
        End If
    Next
Bye
Raf 

 facendo una routine di "pulizia" delle cartelle vuote...
Veramente il oSub.Delete è solo un refuso, nel test uso un msgbox(oSub) 
quello che vorrei fare è cambiare le icone di una cartella vuota e quindi, 
credo sia preferibile partire dal "basso" un tree-dir per controllarne il 
contenuto a ritroso.
In alternativa mi andava bene anche un qualsiasi tool, file manager che 
faccia questo. Mi sono messo a scrivere 2 righe di codice perchè non ho 
trovato nulla in proposito... :-(

 tree-dir per controllarne il contenuto a ritroso.
IMHO se lo scopo è solo quello di cambiare icone, non ha una grande 
importanza l'ordine di visita.
Comunque, col codice che ti ho postato io la visita parte effettivamente 
"dal basso", solo che, *a parità di livello*, l'ordine di visita delle 
subfolder è ascendente e non discendente come chiedevi tu.
Per spiegarmi meglio, se le dir. sono
+1
  +1.1
  +1.2
  +1.3
+2
  +2.1
  +2.2
con l'algoritmo che ti ho mostrato, l'ordine è
1.1, 1.2, 1.3, 1, 2.1, 2.2, 2.3, 2
Ciao
Raf