Как написать все строки в C# без CRLF

Я использую С# и пытаюсь вывести несколько строк в файл ASCII. Проблема, с которой я сталкиваюсь, заключается в том, что мой хост Linux видит эти файлы как:

ASCII text, with CRLF line terminators

Мне нужно, чтобы этот файл был просто:

ASCII text

CRLF вызывает некоторые проблемы, и я надеялся, что в С# есть способ просто создать файл, отформатированный так, как я хочу.

Я в основном использую этот код:

string[] lines = { "Line1", "Line2" };
File.WriteAllLines(myOutputFile, lines, System.Text.Encoding.UTF8);

Есть ли простой способ создать файл без разделителей строк CRLF? Я, вероятно, могу позаботиться об этом на стороне Linux, но лучше просто создам файл в правильном формате с самого начала.


person jared    schedule 11.06.2012    source источник
comment
Вам может быть полезна документация MSDN .NET для класса String, особенно для метода Replace(). См. msdn.microsoft.com/en-us/library/system.string. .aspx   -  person lyrisey    schedule 12.06.2012


Ответы (2)


Предполагая, что вам все еще нужны разрывы строк, вам просто нужны переводы строк вместо возврата каретки/перевода строки, вы можете использовать:

File.WriteAllText(myOutputFile, string.Join("\n", lines));

или если вам определенно нужен разрыв строки после последней строки:

File.WriteAllText(myOutputFile, string.Join("\n", lines) + "\n");

(В качестве альтернативы, как вы говорите, вы можете исправить это на стороне Linux, например, с помощью dos2unix.)

person Jon Skeet    schedule 11.06.2012
comment
Я считаю, что приведенное выше может быть лучше, чем File.WriteAllText(myOutputFile, string.Join(\n, lines) + \n); потому что string,Join помещает разделители между элементами, но разделитель должен стоять после конца каждого элемента, иначе вы потеряете последнюю строку. - person Kev Bo; 08.06.2017
comment
@KenBoorom: но разделитель должен стоять после конца каждого элемента, иначе вы потеряете последнюю строку. - вы не потеряете последнюю строку, просто в конце не будет разрыва строки. Я добавлю это как вариант, хотя. - person Jon Skeet; 08.06.2017
comment
Спасибо за добавление этой опции. В Linux POSIX требует, чтобы последняя строка завершалась таким образом, и многие программы полагаются на это. Они действительно потеряют последнюю строку, если она не будет завершена таким образом. - person Andrew Savinykh; 04.03.2019

Ответ @JonSkeet - быстрое и простое решение. Недостатком является то, что он выделяет одну строку, содержащую все строки текста, перед записью в файл. Для больших объемов текста это может вызвать нагрузку на систему управления памятью.

Альтернативой, позволяющей выполнять потоковую передачу строк без дополнительного распределения, является:

public static void WriteAllLines(
    string path, IEnumerable<string> lines, string separator)
{
    using (var writer = new StreamWriter(path))
    {
        foreach (var line in lines)
        {
            writer.Write(line);
            writer.Write(separator);
        }
    }
}
person Drew Noakes    schedule 17.07.2018