StreamWriter在行尾添加一个额外的\ r \ n

时间:2015-04-17 17:23:50

标签: c# .net visual-studio-2010 iis streamwriter

我创建了一个类,负责生成一个文本文件,其中每一行代表一个' MyDataClass'的对象的信息。类。以下是我的代码的简化:

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上运行应用程序时(我使用run(Ctrl + F5)进行测试,调试(F5),使用调试和释放模式)所有都按照计划进行。但是我在IIS服务器上发布了应用程序,现在StreamWriter类在行结束之前添加了一个额外的\ r \ n。

检查两个生成文件的十六进制读数:

在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);)中写入日志,以查看是否有额外的&#39; \ r&#39;被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天了,我已经尝试了大脑可以思考的一切。有没有人知道我可以尝试什么?

更新

变得更奇怪!我尝试将行_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

4 个答案:

答案 0 :(得分:4)

根据MSDN,WriteLine

  

将数据后跟行终止符写入文本字符串或流。

你的最后一行应该是

 _streamWriter.Write(line);

将它置于循环外部并更改循环,以便它不管理最后一行。

答案 1 :(得分:2)

我的猜测是在FTP期间添加额外的\ r \ n(可能尝试二进制传输)

here

我测试了代码,而额外的/ r不是由当前问题中的代码引起的

答案 2 :(得分:1)

我有类似的问题。 Environment.NewLine和WriteLine给了我额外的\ r字符。但下面的内容对我有用:

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

答案 3 :(得分:0)

我刚才有一个类似的问题,下面的代码将在输出文件(outFile)中随机插入空白行

using (StreamWriter outFile = new StreamWriter(outFilePath, true)) {
     foreach (string line in File.ReadLines(logPath)) {
            string concatLine = parse(line, out bool shouldWrite);
            if (shouldWrite) {
              outFile.WriteLine(concatLine);       
            }     
      }   
}

使用Antar的想法,我更改了解析函数,以使其返回附加了Environment.NewLine的行,即

return myStringBuilder.Append(Environment.NewLine).ToString();

然后在上面的foreach循环中,更改

outFile.WriteLine(concatLine);

outFile.Write(concatLine);

,现在它写入文件时未插入一堆随机的新行。但是,我仍然完全不知道为什么我必须这样做。