用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在那里。奇怪!

如果我浪费了大家的时间,我很抱歉!谢谢!

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

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

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

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