Byte letti dallo StreamReader

venerdì 31 ottobre 2008 - 11.43

RekLats Profilo | Newbie

ciao...

come si fa a conoscere "in tempo reale" quanti byte sono stati letti da un'oggetto StreamReader?
Ho un programma che fa la lettura/parsing di un file di testo, "wrappato" da un oggetto StreamReader, e devo aggiornare nel form una progress bar, che si riempie mano a mano durante la lettura. Essa risulterà completamente riempita solo alla fine del file, una volta cioé che è stato letto completamente.
Esiste una proprietà o un metodo dello StreamReader che mi consente di "vedere" quanti byte ho letto?

llamanna Profilo | Junior Member

Se ho capito qual è il tuo problema, forse possono esserti di aiuto le proprietà descritte di seguito,

StreamReader reader = new StreamReader(@"C:\text.txt");
int lenght = reader.BaseStream.Length; //restituisce il numero di byte letti.
int position = reader.BaseStream.Position //indica la posizione attuale all'interno dello stream

Buon lavoro.
Laura.



http://lauralamanna.blogspot.com/

RekLats Profilo | Newbie

ciao e grazie per la collaborazione....

In realtà:
int lenght = reader.BaseStream.Length; //restituisce il numero di byte totali del file (la dimensione)

Però dovrebbe aiutarmi la proprietà position, come tu giustamente:
int position = reader.BaseStream.Position //indica la posizione attuale all'interno dello stream

Ora se la inserisco nel ciclo di lettura:
long totalBytes = reader.BaseStream.Length;
long byteReaden;

while (!reader.EndOfStream)
{
reader.ReadLine();
byteReaden = reader.BaseStream.Position;
}

byteReaden non si aggiorna (l'ho verificato a runtime) e resta sempre a 1024.
Qualcuno sa spiegarmi perché?

llamanna Profilo | Junior Member

StreamReader.BaseStream.Position non legge sempre 1024, ma si incrementa di tale valore. Mi spiego meglio. Se la riga letta fa spostare la posizione in un valore inferiore a 1024 byte, position sarà sempre 1024. Se ci troviamo in una posizione tra 1024 e 2048 sarà sempre 2048...e così via.

Un modo per ottenere il risultato che vuoi è il seguente:

StreamReader reader = new StreamReader("text.text");

int currentPosition = 0;
while (!reader.EndOfStream)
{
string value = reader.ReadLine();
currentPosition= currentPosition+ value.Length;
}

Esistono dei modi più sofisticati, come creare un proprio StreamReader e fare l'ovverride del metodo ReadLine, ma credo che la soluzione sopra esposta possa essere un buon compromesso.

Buon lavoro.

Laura.

http://lauralamanna.blogspot.com/

RekLats Profilo | Newbie

E' vero, non mi ero accorto che 1024 è la "risoluzione" minima della proprietà position...

Grazie Laura, sei la mia manna!!!
Complimenti pure per il tuo impegno "extrainformatico" nel tuo blog...

Simone

llamanna Profilo | Junior Member

Grazie per i complimenti! e grazie a te per aver visitato il mio blog!
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