2011-09-05 59 views
1

我有如下具有信息的日誌文件(.txt):WriteLine方法

Filename1 - A3332NCDER 
Filename2 - B3332NCDER 
Filename3 - B1222NCDERE 
Filename4 - C1222NCDER 
Filename4 - C1222NCDERE 

每一行保存的文件名和相應的ID。現在我正在挑選ID並將其分配給列表。

char[] delimiters = new char[]{'\n','\r','-'}; 

IList<string> fileIDs = File.ReadAllText(logFileName) 
     .Split(delimiters, StringSplitOptions.RemoveEmptyEntries) 
     .Where((lineItem, index) => index % 2 == 1) 
     .Select(lineItem => lineItem.Trim()) 
     .ToList(); 

我寫如下的日誌文件:

using (StreamWriter logFile = new StreamWriter(logFileName, true)) 
{ 
    logFile.WriteLine(fileName + " - " + fileID); 
} 

這工作fine.I很想知道爲什麼WriteLine方法增加了兩個\n\r

由於

回答

3

這是我們使用類型作家時的歷史包袱。要結束當前行,並開始一個新行,你就必須做兩件事情:

  1. 移動筆架回線的起點 - "Carriage Return"CR
  2. 向上移動的文件,所以你得到了一個空白行上寫上 - "Line Feed"LF

當然,這一切都不是必要的計算機上,但舊習難改......

不同的操作系統使用不同的升INE結束字符(或它們的序列),但對於大系統:

  • 的Windows:CR + LF
  • 的Unix/Linux/OS X:LF
  • 舊的Mac(V9和更早版本):CR

有關操作系統特定行結尾的更多信息和更大的列表,請參閱關於Newline的wikipedias文章。

In。NET中,有一個名爲​​的靜態屬性,其中包含基於運行應用程序的系統的相應行結束字符串。


關於你的代碼,你可以把它簡化一下,只需調用File.ReadAllLines(),你會得到一個包含所有行的數組。這樣你就不必費心使用String.Split等。

或者如果你對.NET 4的依賴性還可以,使用File.ReadLines,它會一次懶讀一行,所以你不必存儲內存中的整個文件。或者第三,你可以做舊但忠實的方法:

string line; 
while ((line = myFile.ReadLine()) != null) 
{ /* do stuff to line here */ } 
3

默認行結束是一個字符串,它的值是一個回車 返回後跟一個換行( 「\ r \ n」 個C#,或vbCrLf在Visual 基本)。

http://msdn.microsoft.com/en-us/library/zdf6yhx5.aspx

的終止可以通過設置來Console.Out.NewLine改變,例如:Console.Out.NewLine = "\r\n\r\n";

0

這就是爲什麼它的WriteLine。如果您不想使用標準行結束符\ n \ r,那麼請使用Write

0

這是一條Microsoft標準行,其結尾爲'\ r \ n'。它來自打字機的日子。本來,第一個字符是將向下移動一行,而第二個字符移動到當前行的開頭。因此,綜合起來,你會看到下一行的開始。