【问题标题】:StreamWriter add an extra \r in the end of the lineStreamWriter 在行尾添加一个额外的 \r
【发布时间】:2015-06-24 16:31:33
【问题描述】:

我创建了一个类,负责生成一个文本文件,其中每一行代表“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 上运行应用程序时(我使用运行 (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 天,我已经尝试了我的大脑能想到的一切。有人知道我可以尝试什么吗?

更新

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

【问题讨论】:

  • 如果您尝试删除编码会发生什么?
  • 错误仍然存​​在。我尝试了不编码,DefaulUTF8"ISO-8859-15"。都给我同样的结果。
  • 是否有可能在从服务器传输文件的过程中添加了额外的\r?
  • 文件保存在一个文件夹中,我通过 FTP 获取它。
  • 哦..这可能是你的问题

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


【解决方案1】:

我刚才遇到了类似的问题,下面的代码会在输出文件(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);

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

【讨论】:

    【解决方案2】:

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

    点赞here

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

    【讨论】:

    • 朋友的脸上流下了喜悦的泪水!
    【解决方案3】:

    我遇到了类似的问题。 Environment.NewLine 和 WriteLine 给了我额外的 \r 字符。但这对我有用:

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

    【讨论】:

    • 这帮助我解决了我的问题,但我不得不使用 .Append(Environment.NewLine) 而不是 .Append("\n")
    • Environment.NewLine 更安全,因为它会为您的代码运行的平台返回换行符。
    【解决方案4】:

    根据 MSDN,WriteLine

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

    你的最后一行应该是

     _streamWriter.Write(line);
    

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

    【讨论】:

    • 如果我的问题仅在最后一行,这可能会起作用。但问题出现在文件的所有行尾。
    • 如果你改变你所有的 writeLine 来写?
    • 我的意思是,由于某些原因,似乎添加了额外的一行。我想知道单独写是否会增加一行。不是解决方案,只是一些验证。
    猜你喜欢
    • 2015-07-12
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2011-06-01
    • 2021-03-29
    相关资源
    最近更新 更多