10

我正在尝试使用我的 C# 程序编写一个带有 Unix 样式换行符的文本文件。

由于某种原因,以下代码不起作用:

TextWriter fileTW = ...

fileTW.NewLine = "\n";

fileTW.WriteLine("Hello World!");

这也不是:

TextWriter fileTW = ...

fileTW.Write("Hello World! + \n");

在这两种情况下,“\n”都被替换为“\r\n”,这是我不想要的!我一直在用十六进制编辑器验证这一点,它显示每一行以 0x0D0A 结尾。

有任何想法吗?

谢谢!

编辑:

对不起大家,虚惊一场!

请允许我解释...

我的 TextWriter 正在写入 MemoryStream,然后使用 SharpZLib 将其添加到 tar 存档中。事实证明,通过使用 WinZIP 提取文本文件,它会将 \n 的每个实例替换为 \r\n。如果我将相同的 tar 存档复制到我的 Ubuntu 机器并在那里解压缩,则只有 \n 存在。诡异的!

对不起,如果我浪费了任何人的时间!谢谢!

4

2 回答 2

18

我无法重现这一点。示例代码:

using System;
using System.IO;

class Test
{
    static void Main()
    {
        using (TextWriter fileTW = new StreamWriter("test.txt"))
        {
            fileTW.NewLine = "\n";            
            fileTW.WriteLine("Hello");
        }
    }
}

然后:

c:\users\jon\Test>dir test.txt
 Volume in drive C has no label.
 Volume Serial Number is 4062-9385

 Directory of c:\users\jon\Test

20/10/2011  21:24                 6 test.txt
               1 File(s)              6 bytes

请注意大小 - 6 个字节 - “Hello”为 5, \n”为 1。如果不设置NewLine属性,则为 7(“\r\n”为 2)。

你能想出一个类似的简短但完整的程序来演示这个问题吗?您如何确定您的文件之后包含“\r\n”?

于 2011-10-20T20:25:17.547 回答
1

我和 Jon Skeet 在同一条船上。这是我对 MemoryStream 的测试,确认它确实使用了你给它的 NewLine 值。

[Test]
public void NewLineIsUnixStyle()
{
    using (var text = new MemoryStream())
    using (TextWriter writer = new StreamWriter(text))
    {
        writer.NewLine = "\n";

        writer.WriteLine("SO");
        writer.Flush();

        text.Position = 0;
        var buffer = new byte[10];
        var b3 = buffer[3];
        Assert.AreEqual(3, text.Read(buffer, 0, 10));
        Assert.AreEqual('S', (char)buffer[0]);
        Assert.AreEqual('O', (char)buffer[1]);
        Assert.AreEqual('\n', (char)buffer[2]);
        Assert.AreEqual(b3, buffer[3]);
    }
}

[Test]
public void NewLineIsSomeTextValue()
{
    using (var text = new MemoryStream())
    using (TextWriter writer = new StreamWriter(text))
    {
        writer.NewLine = "YIPPEE!";

        writer.WriteLine("SO");
        writer.Flush();

        text.Position = 0;
        var buffer = new byte[10];
        Assert.AreEqual(9, text.Read(buffer, 0, 10));
        Assert.AreEqual('S', (char)buffer[0]);
        Assert.AreEqual('O', (char)buffer[1]);
        Assert.AreEqual('Y', (char)buffer[2]);
        Assert.AreEqual('I', (char)buffer[3]);
        Assert.AreEqual('P', (char)buffer[4]);
        Assert.AreEqual('P', (char)buffer[5]);
        Assert.AreEqual('E', (char)buffer[6]);
        Assert.AreEqual('E', (char)buffer[7]);
        Assert.AreEqual('!', (char)buffer[8]);
        Assert.AreEqual(0, buffer[9]);
    }
}

随意修改其中之一,并根据您的场景更新您的答案。

于 2011-10-20T20:43:35.693 回答