2015-04-17 12 views
5

Ho creato una classe con la responsabilità di generare un file di testo in cui ogni riga rappresenta l'informazione di un oggetto della classe "MyDataClass". Qui di seguito è una semplificazione del mio codice:StreamWriter aggiunge un r aggiuntivo alla fine della riga

public class Generator 
{ 
    private readonly Stream _stream; 
    private readonly StreamWriter _streamWriter; 
    private readonly List<MyDataClass> _items; 

    public Generator(Stream stream) 
    { 
     _stream = stream; 
     _streamWriter = new StreamWriter(_stream, Encoding.GetEncoding("ISO-8859-1")); 
    } 

    public void Generate() 
    { 
     foreach (var item in _items) 
     { 
      var line = AnotherClass.GetLineFrom(item); 

      _streamWriter.WriteLine(line); 
     } 

     _streamWriter.Flush(); 
     _stream.Position = 0; 
    } 
} 

e chiamo questa classe come questa:

using (var file = new FileStream("name", FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
{ 
    new Generator(file).Generate(); 
} 

Quando eseguo l'applicazione su Visual Studio (I test con run (Ctrl + F5), eseguire il debug (F5), con la modalità di debug e rilascio) tutto va secondo il piano. Ma pubblico l'applicazione su un server IIS e ora la classe StreamWriter mette un \ r in più prima della fine della riga.

Check it out la lettura esadecimale di entrambi i file generati:

esecuzione in Visual Studio: http://www.jonataspiazzi.xpg.com.br/hex_vs.bmp

esecuzione in IIS: http://www.jonataspiazzi.xpg.com.br/hex_iis.bmp

Alcune cose che ho già controllato:

Scrivi il line variabile (in var line = AnotherClass.GetLineFrom(item);) in un registro per verificare se un extra "\ r" non è stato escluso dalla classe AnotherClass.

Non ha generato nulla, l'ultimo carattere in line è un carattere normale come previsto (nell'esempio sopra è uno spazio).

Scrivere un altro codice per vedere se il problema è generale per tutte le istanze di IIS StreamWriter.

ho provato questo:

var ms = new MemoryStream(); 
var sw = new StreamWriter(ms, Encoding.GetEncoding("ISO-8859-1")); 

sw.WriteLine("Test"); 
sw.WriteLine("Of"); 
sw.WriteLine("Lines"); 

sw.Flush(); 
ms.Position = 0; 

In questo caso il codice funziona bene sia per lo studio visivo e IIS.

Sono in questo per 3 giorni, ho già provato tutto ciò che il mio cervello può pensare. Qualcuno ha qualche idea su cosa posso provare?

UPDATE

Get più strano! Io cerco di sostituire la linea _streamWriter.WriteLine(line); con:

_streamWriter.Write(linhaTexto + Environment.NewLine); 

E ancora peggio:

_streamWriter.Write(linhaTexto + "\r\n"); 

Entrambi mantengono la generazione del \r carattere aggiuntivo.

cerco sostituirlo con questo:

_streamWriter.Write(linhaTexto + "#\r\n#"); 

E ottenere:

http://www.jonataspiazzi.xpg.com.br/hex_sharp.bmp

+0

Cosa succede se tenti di rimuovere la codifica? – Steve

+0

L'errore rimane. Ho provato senza codifica, con 'Defaul', con' UTF8' e con '" ISO-8859-15 "'. Tutti mi danno lo stesso risultato. –

+0

E 'possibile che il \ r aggiuntivo sia aggiunto durante un Trasferimento file dal server? –

risposta

2

La mia ipotesi è che il \ r supplementare è aggiunto durante FTP (forse provare un trasferimento binario)

Come here

ho testato il codice e l'extra/r non è dovuto al codice nella domanda corrente

+0

Lacrime di gioia che rotolano nel mio viso amico! –

4

Secondo MSDN, WriteLine

Scrive dati seguiti da un terminatore di riga al testo stringa o stream.

la tua ultima linea dovrebbe essere

_streamWriter.Write(line); 

Metti al di fuori del vostro ciclo e cambiare il ciclo in modo che non gestisce l'ultima riga.

+0

Questo potrebbe essere lavoro se il mio problema fosse solo nell'ultima riga. Ma il problema si verifica in tutte le terminazioni di riga del file. –

+0

E se si modifica tutto il writeLine per scrivere? – Fjodr

+0

Ho aggiornato la domanda controllarlo. –

0

Ho avuto un problema simile. Environment.NewLine e WriteLine mi hanno dato carattere extra \ r. Ma questo qui di seguito ha lavorato per me:

StringBuilder sbFileContent = new StringBuilder(); 
sbFileContent.Append(line); 
sbFileContent.Append("\n"); 
streamWriter.Write(sbFileContent.ToString());