Написание текстового файла в стиле Unix на C # - PullRequest
9 голосов
/ 21 октября 2011

Я пытаюсь написать текстовый файл с переводом строки в стиле Unix с помощью моей программы на C #.

По какой-то причине следующий код не работает:

TextWriter fileTW = ...

fileTW.NewLine = "\n";

fileTW.WriteLine("Hello World!");

Ни один из них не работаетэто:

TextWriter fileTW = ...

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

В обоих случаях '\ n' заменяется на '\ r \ n', чего я не хочу!Я проверял это с помощью шестнадцатеричного редактора, который показывает каждую строку, заканчивающуюся 0x0D0A.

Любые идеи?

Спасибо!

РЕДАКТИРОВАТЬ:

Извините всех, ложная тревога!

Позвольте мне объяснить ...

Мой TextWriter записывал в MemoryStream, который затем добавлялся в архив tar с помощью SharpZLib.Оказывается, извлекая текстовый файл с помощью WinZIP, он заменял каждый экземпляр \ n на \ r \ n.Если я скопирую тот же архив tar на мою машину с Ubuntu и распакую туда, там будет только \ n.Странно!

Извините, если я впустую потратил время!Спасибо!

Ответы [ 2 ]

15 голосов
/ 21 октября 2011

Я не могу воспроизвести это. Пример кода:

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" и one для "\ n". Без установки свойства NewLine это 7 (два для "\ r \ n").

Можете ли вы придумать похожую короткую, но полную программу, демонстрирующую проблему? Как вы определяете, что ваш файл впоследствии содержит «\ r \ n»?

0 голосов
/ 21 октября 2011

Я в той же лодке, что и Джон Скит. Вот мои тесты против 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]);
    }
}

Не стесняйтесь изменить один из них и обновите свой ответ сценарием.

...