StreamWriter add an extra \r in the end of the line

倾然丶 夕夏残阳落幕 提交于 2019-12-01 16:14:08

问题


I created a class with the responsibility to generate a text file where each line represents the information of an object of 'MyDataClass' class. Below is a simplification of my code:

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

And I call this class like this:

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

When I run the application on visual studio (I test with run (Ctrl+F5), debug (F5), with debug and release mode) all goes according to the plan. But I publish the application in a IIS server and now StreamWriter class put an extra \r before the end of the line.

Check it out the hexadecimal reading of both generated files:

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

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

Some things I already checked:

Write the line variable (in var line = AnotherClass.GetLineFrom(item);) in a log to see if an extra '\r' is uncluded by the class AnotherClass.

Didn't result in nothing, the last char in line is a regular char like expected (in example above is a space).

Write another code to see if the problem is general for all IIS StreamWriter instances.

I tried this:

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 this case the code works well for both visual studio and IIS.

I'm in this for 3 days, I already try everything my brain can think. Did anyone have any clue for what I can try?

UPDATE

Get weirder! I try to replace the line _streamWriter.WriteLine(line); with:

_streamWriter.Write(linhaTexto + Environment.NewLine);

And even worse:

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

Both keep generating the extra \r character.

I try replace with this:

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

And get:

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


回答1:


My guess is that the extra \r is added during FTP (maybe try a binary transfer)

Like here

I've tested the code and the extra /r is not due to the code in the current question




回答2:


According to MSDN, WriteLine

Writes data followed by a line terminator to the text string or stream.

your last line should be

 _streamWriter.Write(line);

Put it outside of your loop and change your loop so it doesn't manage the last line.




回答3:


I had a similar issue. Environment.NewLine and WriteLine gave me extra \r character. But this below worked for me:

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



回答4:


I just now had a similar problem where the code below would randomly insert blank lines in the output file (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);       
            }     
      }   
}

Using Antar's idea I changed my parse function so that it returned a line with Environment.NewLine appended, ie

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

and then in the foreach loop above, changed the

outFile.WriteLine(concatLine);

to

outFile.Write(concatLine);

and now it writes the file without a bunch of random new lines inserted. However, I still have absolutely no idea why I should have to do this.



来源:https://stackoverflow.com/questions/29705703/streamwriter-add-an-extra-r-in-the-end-of-the-line

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!