用c#编写Unix风格的文本文件
本文关键字:文本 文件 风格 Unix 编写 | 更新日期: 2023-09-27 18:11:46
我正在尝试用我的c#程序编写一个带有unix风格换行符的文本文件。
由于某些原因,下面的代码不能工作:
TextWriter fileTW = ...
fileTW.NewLine = "'n";
fileTW.WriteLine("Hello World!");
TextWriter fileTW = ...
fileTW.Write("Hello World! + 'n");
在这两种情况下,''n'都被''r'n'取代了,这是我不想要的!我一直在用十六进制编辑器验证这一点,它显示以0x0da结尾的每行。
任何想法?
谢谢!
编辑:对不起大家,虚惊一场!
请允许我解释一下……
我的textwwriter正在写入内存流,然后使用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个字节-"Hello"是5个,"'n"是1个。如果不设置NewLine
属性,则为7("'r'n"为2)。
你能想出一个类似的简短但完整的程序来演示这个问题吗?如何确定文件之后包含"'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]);
}
}
请随意修改其中一个,并根据您的场景更新您的答案。