Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 12:33
Lunedì, 29/03/2010
Salve a tutti,
data la vostra grande disponibilità vorrei postarvi un errore che mi da un programma,

System.StackOverflowException non è stata gestita

e me lo da su questo codice:

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() = Directory.GetDirectories(Dir)
        For Each subdirectory As String In subdirectoryEntries
            ProcessDir(subdirectory)
        Next

    End Sub

questo crea il file txt con tutti i percorsi precedentemente nominato.

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 9:30
Martedì, 30/03/2010
vi faccio vedere la fonte del problema, questo programma mi dovrebbe mettere su un textbox la lista di tutti i file che ho nel pc, fatto con una pennetta ok, ma sul mio hd con 800gb occupati mi da problemi, vi mostro il codice:

Imports System.IO
Imports System.Text

Public Class formMain

    Dim CountFiles As Integer ' 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)


        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() = 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

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = Label1.Text + 1
    End Sub

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 13:23
Martedì, 30/03/2010
secondo me la variabile countfiles supera il limite consentito dal tipo integer,
prova a dichiararla tipo long

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 13:52
Martedì, 30/03/2010
provo e vi faccio sapere, intanto grazie per la risposta

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 15:06
Martedì, 30/03/2010
ancora niente, da lo stesso problema
che può essere?

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 19:41
Martedì, 30/03/2010
può essere il ciclo
mi spiego meglio: nella procedura processdir con un for each chiedi di esaminare tutte le sotto directory con la stessa procedura che a loro volta per ogni sotto directory nella sotto directory che sta esaminando lancia la stessa procedura
esempio:
ho questo percorso: c:\documents and settings\prog\file.txt

ogni cartella (c:/,prog,documents and settings) contiene tre sotto cartelle quindi:
c:/ ha queste 3:
-windows
-utenti
-documents and settings

documents and settings ha queste 3:
-prog
-prova
-ciao

prog contiene il file
tu parti da c:/
vedi che documents and settings contiene sotto cartelle e inizia un ciclo per quelle
quando entra vede che prog contiene sotto cartelle e inizia un altro ciclo(lo stesso visto che usi la stessa procedura)
e questo accavallarsi di cicli credo lo mandi in errore se il percorso è lungo e ci sono molte sotto cartelle,il lavoro da svolgere è enorme :om:

mi sa ma ti conviene abbandonare quel sistema

fai cosi:
usi una lista che all'inizio contiene tutti i volumi (c:/,e:/ ecc...)
parti dal primo e per ogni sottocartella scrivi il percorso nella lista cosi poi quando ha scritto tutte le sotto cartelle dei volumi,li togli dalla lista(in modo che non li riscansioni),poi avanza nella lista e per la prima sotto cartella ne scrive tutte le sotto cartelle nella lista...e cosi via
potrebbe essere un modo

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 20:13
Martedì, 30/03/2010
ok,
ho capito quello che mi vuoi dire,
ma non ho la piu pallida idea di come fare, ma se io creassi cmq come dici tu, direttamente la lista, potrei salvarla e ricaricalrla senza quel metodo di cui parlavamo nell'altro form?

in piu a chi posso rivolgermi per farmi fare quel codice assurdo, capisco che voi non venite pagati e non voglio chiedervi di farmi quel codice.

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 22:17
Martedì, 30/03/2010
ma non è difficile
praticamente devi solo usare il tuo codice senza la procedura processdir

Codice sorgente - presumibilmente VB.NET

  1. Do
  2.             Dim dir1 As String()
  3.             Dim a As Integer
  4.             dir1 = IO.Directory.GetDirectories(ListBox1.Items.Item(a))
  5.             ListBox1.Items.AddRange(dir1)
  6.             ListBox1.Items.Remove(ListBox1.Items.Item(a))
  7.             Application.DoEvents()
  8.             a += 1
  9.             If a >= ListBox1.Items.Count Then Exit Do
  10.         Loop


questo è uno spunto all'inizio listbox1 contiene e:\
potrebbe dare questo errore
System.UnauthorizedAccessException non è stata gestita
Accesso al percorso 'e:\System Volume Information' negato."
quando provi ad accedere alle cartelle di sistema
adattalo a quello che ti serve e risolvi il problema

PM Quote
Avatar
marco444 (Normal User)
Rookie


Messaggi: 55
Iscritto: 28/03/2010

Segnala al moderatore
Postato alle 18:56
Mercoledì, 31/03/2010
non uccidermi ho provato in questo modo:


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)
      
    End Sub

    Public Sub ProcessFile(ByVal FilePath As String)
        On Error Resume Next
        Do
            Dim dir1 As String()
            Dim a As Integer
            dir1 = IO.Directory.GetDirectories(ListBox1.Items.Item(a))
            ListBox1.Items.AddRange(dir1)
            ListBox1.Items.Remove(ListBox1.Items.Item(a))
            Application.DoEvents()
            a += 1
            If a >= ListBox1.Items.Count Then Exit Do
        Loop

        ' 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
Pagine: [ 1 2 3 4 ] Precedente | Prossimo