2012-07-27 44 views
0

我想爲當前環境更改默認的Environment.NewLine字符。.NET Environment.NewLine - 如何以編程方式設置

我有一個獨立的應用程序將消息寫入控制檯。當核心框架在控制檯環境中工作時,新行是\ r \ n。當我將核心框架移動到Windows服務中時,Environment.NewLine更改爲「\ n」。

我希望能夠將控制檯更改爲始終使用「\ r \ n」,因爲當我將控制檯的輸出重定向到文件時,輸出在從示例記事本中讀取時沒有「窗口新行」。

我希望Console.WriteLine在任何時候都使用\ r \ n。

編輯:

我重定向Console.out:

 ConsoleOut = File.AppendText(fileName); 
     ConsoleOut.AutoFlush = true; 


     Console.SetOut(ConsoleOut); 
     Console.SetError(ConsoleOut); 

每個Console.WriteLine或Console.Write被髮送到一個文件,但正如我說我遇到在Windows不同的行爲服務和獨立的Windows環境中。

+0

這兩種說法是矛盾的:「當核心框架工作在控制檯環境中的新生產線\ r \ n」個,和「我希望Console.WriteLine在任何時候都使用\ r \ n」。 – Polyfun 2012-07-27 09:15:39

+0

'Environment.NewLine'是一個常量。 http://www.dotnetperls.com/newline – 2012-07-27 09:17:49

+0

爲什麼然後如果我從Windows服務運行相同的庫,Console.WriteLine輸出我\ n而不是\ r \ n。我將Console.out重定向到一個文件。相同的代碼在兩個不同的環境中運行。 – Patrik 2012-07-27 09:30:17

回答

4

我不是這個服氣:

當我移動的核心框架爲Windows服務Environment.NewLine改變成「\ n」

我檢查了IL對於get_NewLine(),它被硬編碼爲:

ldstr "\r\n" 
ret 

所以基本上;問題不在於你的想法;改變Environment.NewLine不會做任何事情(和:是不可能的)。

所以:你如何重定向?我傾向於只是像做:

if (!Environment.UserInteractive) 
{ 
    var tw = new SlowWriter(Path.Combine(logPath,"{0}.log")); 
    Console.SetError(tw); 
    Console.SetOut(tw); 
} 

其中SlowWriter是確保該文件不保持開放的自定義類型(子類TextWriter);較慢,但很穩健:

class SlowWriter : TextWriter 
{ // this opens and closs each time; slower, but doesn't lock the file 
    private readonly string path; 
    public SlowWriter(string path) 
    { 
     this.path = path; 
    } 
    public override System.Text.Encoding Encoding 
    { 
     get { return System.Text.Encoding.UTF8; } 
    } 
    private TextWriter Append() 
    { 
     var finalPath = string.Format(path, DateTime.UtcNow.ToString("yyyyMMdd")); 
     return File.AppendText(finalPath); 
    } 
    public override void Write(string value) 
    { 
     lock (this) 
     { 
      using (var file = Append()) 
      { 
       file.Write(value); 
      } 
     } 
    } 
    public override void Write(char[] buffer, int index, int count) 
    { 
     lock(this) 
     { 
      using (var file = Append()) 
      { 
       file.Write(buffer, index, count); 
      } 
     } 
    } 
    public override void Write(char[] buffer) 
    { 
     lock (this) 
     { 
      using (var file = Append()) 
      { 
       file.Write(buffer); 
      } 
     } 
    } 
} 
+0

謝謝馬克。我正在重定向Console.out – Patrik 2012-07-27 09:37:30

1

然後我不認爲你應該使用Environment.NewLine。你所看到的是爲什麼要把它放在第一位的確切原因。我認爲你最好通過定義你使用的appSettings,並將它設置爲控制檯應用程序和Windows服務應用程序的不同值。

更新: 另請參閱Marc Gravell的回答。即使它是硬編碼的,我也不會試圖用上面的動機來改變它。

+0

我沒有使用它。我只是假設Console.WriteLine正在使用它。 – Patrik 2012-07-27 09:36:05

2

您無法修改System.Environment。NEWLINE

MSDN Reference

這是一個只讀屬性

public static string NewLine { get; } 

而且Here您可以閱讀換行符回報始終爲 「\ r \ n」。

接下來我們看看get_NewLine,它用這個IL實現。你可以看到它只是返回「\ r \ n」字符串。

所以我認爲你可以使用一個恆定你的應用程序裏面像

public const NEWLINE = "\r\n"; 

,簡單地使用它來代替Environment.NewLine。

Console.WriteLine在內部不使用Environment.NewLine,而是使用回車符和換行符。附圖Here

默認行結束是一個字符串,它的值是一個回車 返回後跟一個換行(「\ r \ n」個C#,或vbCrLf在Visual 基本)。您可以通過將Out屬性的 TextWriter.NewLine屬性設置爲另一個字符串來更改行終止符。 示例提供了一個說明。

也有關於如何修改這個屬性的示例:

// Redefine the newline characters to double space. 
Console.Out.NewLine = "\r\n\r\n"; 
+0

我同意無法修改System.Environment.NewLine。我認爲Console.WriteLine正在使用System.Environment.NewLine – Patrik 2012-07-27 09:35:22

+0

編輯了有關Console.Writeline的新信息的答案 – 2GDev 2012-07-27 09:40:00

+0

如果此Console.Out.NewLine =「\ r \ n \ r \ n」;那麼這就是我尋找的答案。 – Patrik 2012-07-27 09:43:37

相關問題