C# 使用File.writeAllines()更改行的行尾;

C# 使用File.writeAllines()更改行的行尾;,c#,.net,C#,.net,我正试图用C语言编写一个文件,使用这个文件类方法 public static void WriteAllLines(string path, IEnumerable<string> contents); 行的末尾是CRLF,但我需要它是LF。写入文件的方法有很多种,我只需要使用不同的方法-只有几行: using (var writer = new StreamWriter(path)) { foreach (var line in contents) { w

我正试图用C语言编写一个文件,使用这个文件类方法

public static void WriteAllLines(string path, IEnumerable<string> contents);

行的末尾是CRLF,但我需要它是LF。

写入文件的方法有很多种,我只需要使用不同的方法-只有几行:

using (var writer = new StreamWriter(path)) {
    foreach (var line in contents) {
        writer.Write(line + "\n");
    }
}
您可以自己连接字符串并使用WriteAllText,而不是使用WriteAlline:

这显然与样板代码有关。请记住,使用StringBuilder而不是string[]也会更快

WriteAllines使用StreamWriter,使用属性中指定的换行符字符串将行写入文件

您可以在自己的代码中使用StreamWriter,并使用\n而不是\r\n。这样做的好处是可以避免字符串连接和生成临时字符串:

using (var writer = new StreamWriter(path)) 
{
    writer.NewLine = "\n";
    foreach (var line in contents) 
    {
        writer.WriteLine(line );
    }
}
直接使用StreamWriter还允许您使用异步方法:

public async Task MyMethod()
{
    ....
    using (var writer = new StreamWriter(path)) 
    {
        writer.NewLine = "\n";
        foreach (var line in contents) 
        {
            await writer.WriteLineAsync(line);
        }
    }
    ....
}

在服务器、web应用程序和网站中编写大型文件时,这可能是一个很大的好处,在这些网站中,您希望将阻塞保持在最小值

我同意这一点,它可以避免重新写入内存,而且工作速度很快。这假设您只使用ASCII,不需要覆盖文件-否则使用不同的编码并相应地更改文件模式

    public static void WriteAllLines(string path, IEnumerable<string> contents)
    {
        using (var s = new FileStream(path, FileMode.Append))
        {
            foreach (var line in contents)
            {
                var bytes = Encoding.ASCII.GetBytes($"{line}\r");
                s.Write(bytes,0,bytes.Length);
            }
            s.Flush();
            s.Close();
        }
    }

这会在内存中生成一个巨大的字符串,所以除非你保证你的文件很小,否则我不会这样做。另外,您需要\n,而不是\r.@JoeEnos已修复,谢谢。而且,它是文本,所以我非常怀疑它有那么大。@itsme86想象一下一个日志文件。或者一个网络服务器。即使流量适中,内存使用翻倍也会造成很大危害。或者考虑另一方面:通过加入你最终购买一个更大的云VM来服务相同的流量,因为你的环境有LF作为换行符号,比如Linux?你检查过Environment.Newline常量了吗?既然可以立即写出,为什么还要在内存中创建字符串呢?
public async Task MyMethod()
{
    ....
    using (var writer = new StreamWriter(path)) 
    {
        writer.NewLine = "\n";
        foreach (var line in contents) 
        {
            await writer.WriteLineAsync(line);
        }
    }
    ....
}
    public static void WriteAllLines(string path, IEnumerable<string> contents)
    {
        using (var s = new FileStream(path, FileMode.Append))
        {
            foreach (var line in contents)
            {
                var bytes = Encoding.ASCII.GetBytes($"{line}\r");
                s.Write(bytes,0,bytes.Length);
            }
            s.Flush();
            s.Close();
        }
    }