Domanda

Io sono l'analisi di un file molto grande di record (uno per riga, ciascuno di varia lunghezza), e mi piacerebbe tenere traccia del numero di byte che ho letto nel file in modo che io possa recuperare nel caso di guasto.

ho scritto il seguente:

using (TextReader myTextReader = CreateTextReader())
{
    string record = myTextReader.ReadLine();
    bytesRead += record.Length;
    ParseRecord(record);
}

Tuttavia questo non funziona poiché ReadLine() strisce caratteri CR / LF in linea. Inoltre, una linea può essere risolto da una CR, LF o caratteri CRLF, i quali mezzi non posso aggiungere 1 a bytesRead.

C'è un modo semplice per ottenere la lunghezza della linea attuale, o faccio a scrivere il mio metodo ReadLine() in termini di operazioni Read() granulare?

È stato utile?

Soluzione

Ottenere la posizione corrente del flusso sottostante non sarà di aiuto, poiché la StreamReader il buffering dei dati letti dal flusso.

In sostanza non si può fare questo senza scrivere il proprio StreamReader. Ma non si ha realmente bisogno di?

I sarebbe semplicemente contare il numero di linee di lettura.

Naturalmente, questo significa che la posizione di una linea specifica che sarà necessario leggere le linee N piuttosto che semplicemente cercano di un offset, ma cosa c'è di sbagliato in questo? È stato stabilito che le prestazioni saranno inaccettabili?

Altri suggerimenti

A TextReader legge stringhe, che sono caratteri, che [a seconda della codifica] non è uguale a byte.

Che ne dite di serie solo la memorizzazione di linee leggere, e proprio salto che molte linee per il ripristino? Credo che sia tutta una questione di non dare esecuzione quelli di linea, non necessariamente evitando di leggerli dal flusso.

Vieni a pensarci bene, posso usare un StreamReader e ottenere la posizione corrente del flusso sottostante come segue.

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top