2016-09-15 73 views

回答

3

WriteAllLines使用一個StreamWriter到線寫入一個文件,使用在NewLine屬性中指定的換行字符串。

您可以在自己的代碼中使用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); 
     } 
    } 
    .... 
} 

寫大時,這是一個很大的好處文件,在服務器和網絡應用程序和網站,你想保持至少阻止

2

有寫文件的許多方面,我只是用一個不同的走了 - 只有幾行:

using (var writer = new StreamWriter(path)) { 
    foreach (var line in contents) { 
     writer.Write(line + "\n"); 
    } 
} 
0

而不是使用WriteAllLines()的,你可以自己使用,並加入了串WriteAllText()

File.WriteAllText(string path, string.Join("\n", contents) + "\n"); 
+2

這會在內存中產生一個巨大的字符串,所以我會避免這種情況,除非你保證你的文件很小。另外,你需要'\ n',而不是'\ r'。 –

+0

@JoeEnos修正,謝謝。此外,它是文字,所以我非常懷疑這是巨大的。 – itsme86

+2

@ itsme86想象一個日誌文件。或者一個Web服務器。如果流量適中,加倍內存使用可能會造成很多傷害。或者考慮另一方:通過加入你最終購買更大的雲虛擬機來提供相同的流量 –

0
  var builder = new StringBuilder(); 
      for (int i = 0; i < 99999; i++) 
      { 
       builder.Append(i.ToString() + '\n'); 
      } 

      File.WriteAllText("asd.txt", builder.ToString()); 

與樣板代碼顯然是。請記住,使用StringBuilder而不是string[]也更快。

enter image description here

+3

爲什麼要在內存中創建字符串時,你可以立即寫出它? –

0

我會去這個,它避免了重寫到內存,並迅速工作。這假設您只使用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(); 
     } 
    }