Oppure

Loading
29/03/10 10:33
marco444
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.
aaa
30/03/10 7:30
marco444
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
aaa
30/03/10 11:23
walker93
secondo me la variabile countfiles supera il limite consentito dal tipo integer,
prova a dichiararla tipo long
aaa
30/03/10 11:52
marco444
provo e vi faccio sapere, intanto grazie per la risposta
aaa
30/03/10 13:06
marco444
ancora niente, da lo stesso problema
che può essere?
aaa
30/03/10 17:41
walker93
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 (/… 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 (/,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
aaa
30/03/10 18:13
marco444
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.
aaa
30/03/10 20:17
walker93
ma non è difficile
praticamente devi solo usare il tuo codice senza la procedura processdir

        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

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
aaa