Writing Unix style text file in C#

北城余情 提交于 2019-11-29 13:27:03

I'm unable to reproduce this. Sample code:

using System;
using System.IO;

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

Afterwards:

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

Note the size - 6 bytes - that's 5 for "Hello" and one for the "\n". Without setting the NewLine property, it's 7 (two for "\r\n").

Can you come up with a similar short but complete program demonstrating the problem? How are you determining that your file contains "\r\n" afterwards?

I'm in the same boat as Jon Skeet. Here's my tests against a MemoryStream that confirm it does use what you give it as the NewLine value.

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

Feel free modify one of these and update your answer with your scenario.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!