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

Jon*_*zzi 6 .net c# iis streamwriter visual-studio-2010

我创建了一个类,负责生成一个文本文件,其中每一行代表'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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我称这个类是这样的:

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

当我在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变量(in var line = AnotherClass.GetLineFrom(item);)写入日志中,以查看类是否包含额外的'\ r' AnotherClass.

没有结果,最后一个char line是一个像预期的常规char(在上面的例子中是一个空格).

编写另一个代码以查看问题是否适用于所有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;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,代码适用于visual studio和IIS.

我已经在这3天了,我已经尝试了大脑可以想到的一切.有没有人知道我可以尝试什么?

UPDATE

变得怪异!我尝试用以下代码替换该行_streamWriter.WriteLine(line);:

_streamWriter.Write(linhaTexto + Environment.NewLine);
Run Code Online (Sandbox Code Playgroud)

更糟糕的是:

_streamWriter.Write(linhaTexto + "\r\n");
Run Code Online (Sandbox Code Playgroud)

两者都保持产生额外的\r角色.

我尝试用这个代替:

_streamWriter.Write(linhaTexto + "#\r\n#");
Run Code Online (Sandbox Code Playgroud)

得到:

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

Fjo*_*odr 6

根据 MSDN,WriteLine

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

你的最后一行应该是

 _streamWriter.Write(line);
Run Code Online (Sandbox Code Playgroud)

把它放在你的循环之外并改变你的循环,这样它就不会管理最后一行。


小智 3

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

这儿

我已经测试了代码,额外的 /r 不是由于当前问题中的代码造成的