Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Vb.net Errore System.StackOverflowException non è stata gestita
Forum - C# / VB.NET - Vb.net Errore System.StackOverflowException non è stata gestita - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:35
Mercoledì, 31/03/2010
L'eccezione era data dall'eccessiva ricorsività della funzione ProcessDir. Concordo con walker nella soluzione, ma il suo codice è errato, poiché le sottocartelle vengono aggiunte alla lista con la stessa logica della funzione ricorsiva: infatti, pur usando un indice a, dopo la prima iterazione, il secondo elemento non sarà il secondo volume ma la seconda sottocartella del primo volume, e così via. Questo solo in teoria, perchè uscirà dal ciclo ad un certo punto dell'elaborazione a priori sconsciuto, a causa dell'indice a.

Usa semplicemente IO.Directory.GetDirectories per elencare le sottodirectory di primo livello in un volume. Fai selezionare all'utente una di queste, quindi elenca le sue sottodirectories, e così via...

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 19:42
Mercoledì, 31/03/2010
praticamente deve diventare questo?

Imports System.IO
Imports System.Text

Public Class formMain

    Dim CountFiles As Long ' Variabile che tiene conto del numero di files scansionati
    Dim FileList As StringBuilder ' Qui memorizzo l'elenco dei files

  

    Private Sub btnProcess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcess.Click
        On Error Resume Next
        If Directory.Exists("c:\") Then ' controllo che la directory esista

            CountFiles = 0 ' azzero il contatore dei files

            FileList = New StringBuilder ' Istanzio un nuovo StringBuilder

            txtList.Text = "" ' pulisco la textbox

            Me.Cursor = Cursors.WaitCursor ' Imposto la clessidra

            ProcessDir("c:\") ' processo directory e files

            txtList.Text = FileList.ToString ' Scrivo il contenuto dello stringbuilder nella textbox (elenco files)


            Me.Cursor = Cursors.Arrow ' Reimposto la freccia

            MessageBox.Show(CountFiles & " Files scansionati", "Scansione", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Timer1.Enabled = False

        Else

            MessageBox.Show("La directory non esiste", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

        End If

    End Sub

    Public Sub ProcessDir(ByVal Dir As String)
        On Error Resume Next
        ' Processa la lista dei files trovati nella directory passata
        Dim fileEntries As String() = Directory.GetFiles(Dir)
        For Each fileName As String In fileEntries
            ProcessFile(fileName)
        Next

        ' Processa tutte le directory trovate nella directory passata alla funzione
        Dim subdirectoryEntries As String() = IO.Directory.GetDirectories(Dir)
        For Each subdirectory As String In subdirectoryEntries
            ProcessDir(subdirectory)
        Next
    End Sub

    Public Sub ProcessFile(ByVal FilePath As String)
        On Error Resume Next
      
        ' processa il file

        ' possiamo recuperare varie informazioni sul file tramite FileInfo
        ' ed eventualmente inserire qui altre routine di controllo, in questo
        ' codice ci limitiamo soltanto ad elencare tutti i files con le sottodirectory
        ' Dim InfoFile As New FileInfo(FilePath)

        FileList.Append(FilePath & vbCrLf) ' aggiungo il file esaminato ora alla lista

        CountFiles += 1 ' incremento il numero di files

      

    End Sub

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 0:24
Giovedì, 01/04/2010
beh totem con il mio codice esco dal ciclo do quando 'a' supera il numero di elementi nella listbox cosi da evitare errori
comunque il secondo elemento è un volume e nonuna sottocartella
all'inizio la listbox contiene tutti i volumi
quindi prima scrive le sottocartelle del 1° vol. poi quelle del 2° ,3° ecc..
poi scrive le sottocartelle della 1° sottocartella del 1° volume poi della 2° sottocartella ancora del primo volume...
quando non ci sono più sottocartelle, 'a' supera il numero di elementi nella listbox e esce dal ciclo

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:32
Giovedì, 01/04/2010
Sì, ero rimbambito io ieri sera. Comunque anche quel codice comporta un tempo di elaborazione notevole, e potrebbe generare errori di overflow (non per altro, ma perchè la listbox potrebbe non contenere così tanti elementi).

Se volete contare i files con una funzione ricorsiva, beh, non c'è modo di evitare lo sbilanciamento dello stack se si elabora un intero volume. Il loop è decisamente meglio ma sicuramente NON su una listbox, per due motivi:
- la collezione Items è debolmente tipizzata, quindi ad ogni aggiunta bisogna eseguire un cast sul tipo object;
- listbox è un controllo visuale e si aggiorna ogni volta che viene aggiunto un elemento, senza contare tutti gli eventi che vengono lanciati, anche se i sottoscrittori non esistono.
Per una performance decisamente migliore urge utilizzare una collezione adatta, ad esempio List(Of T). Inoltre, dato il tempo impiegato, sarebbe utile eseguire il tutto in background o in un thread separato, così da non bloccare l'applicazione. Application.DoEvents() è una soluzione non troppo elegante.

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 10:42
Giovedì, 01/04/2010
percio non c'è una soluzione alla fine di tutto?

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 10:43
Giovedì, 01/04/2010
non c'è modo per esempio di salvare il contenuto di un OpenFileDialog, in una lista sul pc in modo da ricaricarla quando uno vuole, probabilmente ho detto una cavolata.

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:03
Giovedì, 01/04/2010
Ti ho appena scritto una possibile soluzione...

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 12:16
Giovedì, 01/04/2010
non avresti un qualche esempio, perchè non ho la più pallida idea di come applicare quello che mi hai detto

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo