Ma se lo scopo è memorizzare in un file l'albero delle cartelle ti basta usare il comando shell tree, magari ridirezionandone l'output su un file.
Boh, a me pare di averla scritta il più elegante possibile... la funzione ricorsiva funziona benone in questi casi, pur aggiungendo un certo overhead a causa delle riscritture nello stack causate dalla ricorsione (ma si tratta comunque di un effetto trascurabile).1) il primo dubbio rimane sempre: esisterà un'implementazione più elegante?
Sposta l'aggiunta dell'indentazione:2) problema problema problema: viene messa l'indentazione anche alla cartella root. Un modo per risolverlo, SENZA mettere un fastidioso "If" che vede se la cartella è la root e SENZA inserire nel codice chiamante il For Each...Next relativo alle sottocartelle, rinunciando all'elegante ListFolders mFso.GetFolder(Root), strSpaces ? A me sembra che non esista
codice:Dim mFso, Drive, fList, strSpaces, strIndent Root = "c:\" Set mFso = CreateObject("Scripting.FileSystemObject") Set fList = mFso.CreateTextFile("C:\ElencoCartelle.txt", true) strSpazi = "" 'Occhio: qui il nome è sbagliato, anche se si tratta di un'istruzione trascurabile strIndent = " " ListFolders mFso.GetFolder(Root), strSpaces Set fList = Nothing Set mFso = Nothing Sub ListFolders(Fld, strSpazi) On Error Resume Next Dim strFolder, subFolder fList.WriteLine(strSpazi & Fld) 'Imposta la variabile strFolder sulla cartella corrente 'Enumera le cartelle contenute For Each strFolder In Fld.Subfolders strSpazi = strSpazi & strIndent fList.WriteLine(strSpazi & strFolder) If strFolder.SubFolders.Count > 0 Then For Each subFolder In strFolder.SubFolders 'Processa la sottocartella strSpazi = strSpazi & strIndent ListFolders subFolder, strSpazi Next End If strSpazi = Left(strSpazi, Len(strSpazi) - Len(strIndent)) Next strSpazi = Left(strSpazi, Len(strSpazi) - Len(strIndent)) End Sub

Rispondi quotando