C# 用C编写Unix风格的文本文件#

C# 用C编写Unix风格的文本文件#,c#,newline,textwriter,C#,Newline,Textwriter,我正试图用我的C#程序编写一个带有Unix风格新行的文本文件 由于某些原因,以下代码不起作用: TextWriter fileTW = ... fileTW.NewLine = "\n"; fileTW.WriteLine("Hello World!"); 这也不是: TextWriter fileTW = ... fileTW.Write("Hello World! + \n"); 在这两种情况下,'\n'都被替换为'\r\n',我不希望这样!我已经用一个十六进制编辑器验证了这一点,

我正试图用我的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存在。奇怪


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

我无法复制这个。示例代码:

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字节-5表示“Hello”,1表示“\n”。如果不设置
换行符
属性,则为7(两个表示“\r\n”)


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

我和Jon Skeet处境相同。下面是我对MemoryStream的测试,它确认它确实使用了您给它的换行符值

[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]);
    }
}

请随意修改其中一个,并根据您的情景更新您的答案。

您使用TextWriter的原因是什么?例如,您可以使用FileStram…我首先使用TextWriter写入MemoryStream。似乎在稍后我尝试将MemoryStream写入文件时添加了/r,而不是由TextWriter添加。让我做一点挖掘,我会回到大家身边!谢谢大家抽出时间!谢谢你,乔恩!你的代码在我这边也能正常工作。当我尝试将MemoryStream写入文件时,似乎/r是稍后添加的,而不是由TextWriter添加的。让我做一点挖掘,我会回到大家身边@dan6470:我非常怀疑
MemoryStream
是否在做这样的事情。您能告诉我们更多关于您正在做什么,以及之后如何检查
\r\n
的信息吗?