Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di natasha
    Registrato dal
    Sep 2000
    Messaggi
    1,307

    Script o programma per elencare l'albero delle sottocartelle di una cartella

    Buongiorno a tutti,
    avrei bisogno di uno script (preferibilmente VBS, ma anche ASP o ASP.NET) o di un programma eseguibile per elencare l'albero delle sottocartelle di una cartella.
    Potete aiutarmi?
    Kisses,

    Nat

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Qui si parla solo di VBS... per le altre tecnologie, ci sono gli appositi forum.

    Ho spostato la discussione all'interno del forum dedicato a Visual Basic (VBx, VBA, ...) e ai linguaggi per .NET Framework (VB.NET, C#, ...).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Se n'è parlato da poco, in una discussione relativa all'eliminazione ricorsiva di files; in particolare il codice di ricerca ricorsiva che puoi facilmente adattare al tuo scopo è in questo post.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di natasha
    Registrato dal
    Sep 2000
    Messaggi
    1,307
    Mille grazie per il suggerimento
    Modificando opportunamente lo script, ho risolto così:

    codice:
    Dim mFso, Drive, fList, strSpaces, strIndent
    Root = "c:\"
    Set mFso = CreateObject("Scripting.FileSystemObject")
    Set fList = mFso.CreateTextFile("C:\ElencoCartelle.txt", true)
    strSpaces = ""
    strIndent = "   "
    ListFolders mFso.GetFolder(Root), strSpaces
    Set fList = Nothing
    Set mFso = Nothing
    
    Sub ListFolders(Fld, strSpazi) 
       On Error Resume Next
       Dim strFolder, subFolder   
       strSpazi = strSpazi & strIndent
       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	      
                  ListFolders subFolder, strSpazi
               Next
            End If
            strSpazi = Left(strSpazi, Len(strSpazi) - Len(strIndent))
       Next
       strSpazi = Left(strSpazi, Len(strSpazi) - Len(strIndent))
    End Sub
    Ho naturalmente modificato opportunamente la visita dell'albero per poter gestire l'indentazione.
    Rimangono aperti due problemi:

    1) il primo dubbio rimane sempre: esisterà un'implementazione più elegante?
    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

  5. #5
    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.
    1) il primo dubbio rimane sempre: esisterà un'implementazione più elegante?
    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).
    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
    Sposta l'aggiunta dell'indentazione:
    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
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di natasha
    Registrato dal
    Sep 2000
    Messaggi
    1,307
    Boh, a me pare di averla scritta il più elegante possibile...
    Ehm.... naturalmente mi riferivo alla mia, di implementazione
    Grazie per l'errore, irrilevante e dunque più subdolo da rilevare....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.