sabato 3 marzo 2007

Una Funzione per Elencare Cartelle e Sottocartelle

A volte capita di dover scrivere delle routines che ricerchino un determinato file sul computer, oppure che leggano la struttura di una cartella, oppure ancora che creino una copia identica di una cartella con le relative sottocartelle in una nuova posizione.

In tutti questi casi, è necessario trovare un sistema per elencare le sottocartelle partendo da una cartella madre, e quindi navigare poi i risultati per effettuare le operazioni che ci interessano.
Può sembrare banale ma non lo è affatto per chi, come me, si è avvicinato tardi alla programmazione e lo ha fatto fondamentalmente da autodidatta. Chiunque volesse cimentarsi in un giochino "intellettuale" è invitato a ragionare su come scriverebbe una routine che navighi una cartella e ne sfogli tutte le sottocartelle. Vi assicuro che non è esattamente banale e per ottenere questo risultato, qualche anno fa, ho dovuto scrivere 3 o 4 funzioni per un totale di un centinaio di righe.

Ultimamente, con un pò di esperienza in più sulle spalle, mi sono trovato nuovamente ad affrontare il problema e ho cercato di riscrivere quelle funzioni in una maniera un pò più "scientifica" e fondamentalmente di ottimizzarle un pò.

Per riuscirci ho dovuto apprendere il concetto, piuttosto semplice tuttavia, delle funzioni ricorsive e cioè della possibilità di richiamare una funzione o routine dalla funzione stessa.

Il risultato è quello che trovate qua sotto, con la speranza come al solito che sia utile a qualcuno.


Public Function EnumerateSubFolders(ByVal RootFolder As String) As String()
Dim FolderTree(10000) As String

DoEnumerateSubFolders(RootFolder, FolderTree)

If Array.IndexOf(FolderTree, RootFolder) = -1 Then
FolderTree(Array.IndexOf(FolderTree, Nothing)) = RootFolder
End If

Array.Resize(FolderTree, Array.IndexOf(FolderTree, Nothing))

Return FolderTree
End Function


Private Sub DoEnumerateSubFolders(ByVal RootFolder As String, _
ByRef FolderArray As String())
Dim DirList As String()
DirList = System.IO.Directory.GetDirectories(RootFolder)

For i As Integer = 0 To DirList.GetUpperBound(0)
FolderArray(Array.IndexOf(FolderArray, Nothing)) = DirList(i)
DoEnumerateSubFolders(DirList(i), FolderArray)
Next
End Sub

Nessun commento: