Comportamento strano stream writer

lunedì 14 aprile 2008 - 14.49

Lucifel Profilo | Junior Member

Ciao a tutti,
ho un problema su uno stream writer perché si comporta in modo strano.
In pratica io ho un codice del genere:

Dim f As New StreamWriter("C:\file.txt") f.AutoFlush = False for i as integer = 1 to n // all'incirca sono 520 iterazioni // estraggo i dati che mi servono e compongo la stringa Dim testo As String = String.Format("{0} || {1} || {2} || {3} ||", A, B, C, D) // Dove A, B, C, D sono variabili. A e B sono stringhe e C e D sono numeri f.WriteLine(testo) f.Flush() next f.close()

Il comportamento strano è questo:
Se faccio il f.Close() sul file alla fine mi trovo circa 25 righe e non le 500 che mi aspetto.
Se non lo faccio mi ritrovo ful file circa 500 righe, ma mi mancano se ultime, come se il buffer fosse finito e non fosse più riuscito a scrivere.

Che io metta f.Flush() o no non cambia assolutamente nulla...

Ho provato anche ad andare in debug e la cosa strana è che se anche io metto f.Close() scrive correttamente le righe sul file solo che alla fine cancella tutto, senza alcuna ragione, e riscrive delle righe... non necessariamente le ultime che estrae.

Qualcuno sa come risolvere questo comportamento strano? Grazie

Diego
-----------------------------------
Avanti sempre e comunque!
-----------------------------------

Lanello Profilo | Senior Member

strano questo comportamento...

io lo streamwriter lo uso così... vedi un po se ti può aiutare:

Dim w As StreamWriter w = File.CreateText("C:\antani.txt") for i=0 to 520 w.WriteLine("questa è la riga" & i.tostring) next w.close


ps: il codice l'ho scritto direttamnete qui nel browser ricontrollalo
facci sapere

-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Lucifel Profilo | Junior Member

Grazie,
ho provato il tuo codice, ma ho ancora lo stesso comportamento strano...

Magari è dovuto al fatto che ho delle operazioni strane dentro il ciclo... in pratica è così...


for i = 0 to n try // serie di operazioni tante delle quali vanno in eccezione catch finally Dim testo As String = ... // Creo un testo... f.WriteLine(testo) f.Flush() end try next f.Close()
Diego
-----------------------------------
Avanti sempre e comunque!
-----------------------------------

Lanello Profilo | Senior Member

ma come tante delle quali vanno in eccezione!??!?!?!

sei pazzo!?!?!? (skerzo ovviamente)

gestisci ed intercetta gli erorri!!!

mai fare un rpogramma che si BASI sulle eccezioni!!!!!

il TRY serve solo per evitare problemi per l'utente in caso di errori particolari NON PREVISTI dal programmatore, evitando al programmatore stesso di fare una figuraccia

non a caso si chiamano ECCEZIONI

cerca di rivedere un po il tuo codice che genera il testo...

metti che una delle eccezioni invece che scrivere "ciao mondo" ti generi una stringa che contiene 100 backspace ...

-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Lucifel Profilo | Junior Member

Mi sono spiegato male...
il try catch mi serve per fare un calcolo... un calcolo totalmente estraneo alla scrittura sullo stream writer...

In pratica

for each p in list ' estraggo dati A, B, C, D try ' Faccio calcoli f(A, B, C, D) catch ' Gestisco l'eccezione che mi da f finally ' Voglio scrivere sul file A, B, C, D indipendentemente dal risultato del calcolo sw.writeline(testo(A, B, C, D)) end try next

Stavolta spero di essermi spiegato meglio...
Indipendentemente dal numero di eccezioni che ho dovrebbe scrivere sul file tutte le righe... invece no...

Ho anche provato a mettere a commento la funzione f... e quindi non mi genera più eccezioni...
sempre tutto come prima.... si blocca per qualche strano motivo prima di arrivare in fondo...

Diego
-----------------------------------
Avanti sempre e comunque!
-----------------------------------

Lanello Profilo | Senior Member

ribadisco che secondo me sbagli a gestire il tuo codice con le eccezioni, comunque...

per lo streamwriter, se vuoi controllare cosa viene inviato al comando streamwrite, creati una variabile stringa, appoggiaci il contenuto che vuoi scrivere, stampalo sul debug.writeline (così vedi tutto il testo nella finestra immediata durante l'esecuzione del programma stesso in debug) e poi sollo dopo mandalo allo streamwriter

dim t as string t="" for each p in list ' estraggo dati A, B, C, D try ' Faccio calcoli f(A, B, C, D) catch ' Gestisco l'eccezione che mi da f finally ' Voglio scrivere sul file A, B, C, D indipendentemente dal risultato del calcolo t=testo(A, B, C, D) debug.writeln(t,"controllo") sw.writeline(t) end try next

e guarda un po cosa succede nella finestra di debug...

se nel debug viene fuori tutto e nello streamwriter no... è un problema molto strano ... se invece in entrambe hai gli stessi errori, il problema è nella generazione del testo da mettere nella variabile "t"

-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Lucifel Profilo | Junior Member

Ho trovato cosa non andava...

Mi sono fatto il debug riga x riga... comunque il fatto era che la funzione che scrive sullo streamwriter è chiamata da un'altra funzione all'interno di un ciclo, e quindi al giro successivo mi cancellava il file anziché aggiungere righe... ora devo solo trovare una soluzione efficiente.

Per quanto riguarda le eccezioni: purtroppo non posso prevedere tutti i comportamenti strani dell'utente. Mi spiego: le 4 variabili sono classi costruite da me e vengono riempite da valori dell'utente, da un data provider, da un database gestito da un altro ufficio, e da altre funzioni che fanno calcoli. Purtroppo non posso prevedere tutti i casi di errore... ho gestito tramite degli if quelli che sono sicuro che si possono verificare... x gli altri... usare il try catch era l'unica soluzione, altrimenti si fermava l'applicazione...

Grazie x il tuo aiuto

Diego
-----------------------------------
Avanti sempre e comunque!
-----------------------------------

Lanello Profilo | Senior Member

Felice di averti aiutato!

-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5