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

我正在尝试用我的C#程序用Unix风格的换行编写一个文本文件。

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

TextWriter fileTW = ... fileTW.NewLine = "\n"; fileTW.WriteLine("Hello World!"); 

这也不是:

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

在这两种情况下,’\ n’都被’\ r \ n’替换,我不想要! 我一直用hex编辑器validation这一点,它显示每行以0x0D0A结尾。

有任何想法吗?

谢谢!

编辑:

对不起大家,误报!

请允许我解释一下……

我的TextWriter正在写一个MemoryStream,然后使用SharpZLib将其添加到tar存档中。 事实certificate,通过使用WinZIP提取文本文件,它正在用\ r \ n替换\ 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个字节 – “Hello”为5,“\ n”为1。 如果不设置NewLine属性, NewLine 7(两个用于“\ r \ n”)。

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

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

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

Interesting Posts