marco444 (Normal User)
Rookie
Messaggi: 55
Iscritto: 28/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.
|
|
marco444 (Normal User)
Rookie
Messaggi: 55
Iscritto: 28/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
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
secondo me la variabile countfiles supera il limite consentito dal tipo integer,
prova a dichiararla tipo long
|
|
marco444 (Normal User)
Rookie
Messaggi: 55
Iscritto: 28/03/2010
|
provo e vi faccio sapere, intanto grazie per la risposta
|
|
marco444 (Normal User)
Rookie
Messaggi: 55
Iscritto: 28/03/2010
|
ancora niente, da lo stesso problema
che può essere?
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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
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
|
|
marco444 (Normal User)
Rookie
Messaggi: 55
Iscritto: 28/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.
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
ma non è difficile
praticamente devi solo usare il tuo codice senza la procedura processdir
Codice sorgente - presumibilmente VB.NET |
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
|
|
marco444 (Normal User)
Rookie
Messaggi: 55
Iscritto: 28/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
|
|