2015-04-17 130 views
5

我創建了一個類,負責生成一個文本文件,其中每行代表「MyDataClass」類的對象的信息。下面是我的代碼的簡化:StreamWriter在該行的末尾添加了一個額外的 r

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; 
    } 
} 

我調用這個類是這樣的:

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

當我運行Visual Studio中的應用程序(我與運行測試(按Ctrl + F5),調試(F5),調試和發佈模式)都按照計劃進行。但是我在IIS服務器上發佈應用程序,現在StreamWriter類在行尾之前放置了一個額外的\ r。

檢查出來兩個生成的文件的十六進制閱讀:

在Visual Studio中運行: http://www.jonataspiazzi.xpg.com.br/hex_vs.bmp

運行在IIS: http://www.jonataspiazzi.xpg.com.br/hex_iis.bmp

我已經查了一些事情:

寫下line變量(在var line = AnotherClass.GetLineFrom(item);)在日誌中查看是否額外'\ r'未被類AnotherClass排除。

沒有造成什麼,在line的最後一個字符是一個普通的字符像預期的(例如,在上面的空間)。

編寫另一個代碼以查看該問題是否適用於所有IIS StreamWriter實例。

我嘗試這樣做:

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; 

在這種情況下,代碼非常適用於Visual Studio和IIS。

我在這裏呆了3天,我已經嘗試了我的大腦可以思考的一切。有沒有人有任何線索我可以嘗試?

UPDATE

獲取怪異!我嘗試更換線_streamWriter.WriteLine(line);

_streamWriter.Write(linhaTexto + Environment.NewLine); 

更糟糕:

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

兩個保持產生額外的\r字符。

我嘗試用這個代替:

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

並獲得:

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

+0

如果您嘗試刪除編碼,會發生什麼情況? – Steve

+0

錯誤依然存在。我試着用'UTF8'和''ISO-8859-15''編碼''Defaul'。所有的結果都一樣。 –

+0

在從服務器進行文件傳輸期間是否可能添加了額外的\ r? –

回答

2

我的猜測是,FTP期間額外\ r被加入(也許嘗試二進制傳輸)

here

我測試過的代碼,額外/ r不是由於當前問題中的代碼

+0

歡樂的淚水在我的臉上滾動朋友! –

4

根據MSDN,的WriteLine

寫入數據,然後行結束文本字符串或流。

你的最後一行應該是

_streamWriter.Write(line); 

把它放在你的循環之外,改變你的循環,因此不管理的最後一行。

+0

這可能是工作,如果我的問題只在最後一行。但問題出現在文件的所有行尾。 –

+0

如果您更改所有writeLine以進行寫入? – Fjodr

+0

我更新了問題查看。 –

0

我有類似的問題。 Environment.NewLine和WriteLine給了我額外的\ r字符。但是,這下面爲我工作:

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