2012-05-24 6 views
6

다음 코드를 컴파일하고 결과 응용 프로그램을 실행하면 이름을 입력하고 Enter 키를 누른 다음 아무 키나 눌러 종료합니다. 이 모든 작업은 콘솔 창에서 수행됩니다.우리의 작업을 콘솔 창에 텍스트 파일로 저장하는 방법은 무엇입니까?

using System; 

namespace HelloWorld 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.Write("Enter your name: "); 
      var name = Console.ReadLine(); 
      Console.WriteLine("Your name is {0} ", name); 
      Console.ReadKey(); 

     } 
    } 
} 

이러한 모든 작업을 로그 파일로 텍스트 파일에 저장할 수 있습니까?

편집 :

실제 시나리오를 설명해야합니다. 나는 C#에 관한 책을 쓰고있다. 내 책의 파일 크기를 가능한 작게 만들고 싶기 때문에 콘솔 창의 스크린 샷을 책에 붙이지 않는 것이 좋습니다. 대신 콘솔 창 내용을 보여주는 텍스트 파일을 책에 첨부하려고합니다. 텍스트 파일을 만들기위한 추가 코드를 추가하면 코드 예제가 복잡해 지므로 독자가 혼란 스러울 수 있습니다.

+0

좋아요, 마술별로? 또는 파일을 열고, 액션을 작성하고, 닫으시겠습니까? –

+3

@TiagoPeczenyj 마술 방식에 투표! –

+0

@ReedCopsey Magic 접근법입니다. 약 15 분 정도 걸릴거야. 하나 쓰기. – Servy

답변

2

오케이, 여기서는 콘솔 입력 및 출력에 대한 리더/라이터를 변경하여 이전의 작업을 수행 할뿐만 아니라 로그 파일에도 기록하는 방법을 사용합니다. Log 클래스는 파일 이름/경로를 매개 변수로 사용하도록 확장해야하지만 출력 스트림을 동기화 할 수 있도록하는 것이 중요했습니다. 이제 우리는 Main의 시작 부분에서 우리는 다음과 같은 권리를 다하겠습니다 이러한 클래스를 만들었으므로

public class Log 
{ 
    private StreamWriter output; 
    public Log() 
    { 
     output = new StreamWriter(File.OpenWrite("output.txt")); 

    } 
    public void Write(char c) 
    { 
     lock (output) 
     { 
      output.Write(c); 
     } 
    } 
    public void Close() 
    { 
     output.Close(); 
    } 
} 

public class MyConsoleOutput : TextWriter 
{ 
    private TextWriter standard; 
    private Log log; 

    public MyConsoleOutput(TextWriter standard, Log log) 
    { 
     this.standard = standard; 
     this.log = log; 
    } 

    public override void Write(char value) 
    { 
     standard.Write(value); 
     log.Write(value); 
    } 

    public override Encoding Encoding 
    { 
     get { return Encoding.Default; } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     standard.Dispose(); 
    } 
} 

public class MyConsoleInput : TextReader 
{ 
    private TextReader standard; 
    private Log log; 
    public MyConsoleInput(TextReader standard, Log log) 
    { 
     this.standard = standard; 
     this.log = log; 
    } 

    public override int Peek() 
    { 
     return standard.Peek(); 
    } 


    public override int Read() 
    { 
     int result = standard.Read(); 
     log.Write((char)result); 
     return result; 
    } 
    protected override void Dispose(bool disposing) 
    { 
     standard.Dispose(); 
    } 
} 

:

:

Log log = new Log(); 
Console.SetOut(new MyConsoleOutput(Console.Out, log)); 
Console.SetIn(new MyConsoleInput(Console.In, log)); 

우리는 또한 Main의 끝이 필요합니다

log.Close(); 

다소 빠르고 지저분합니다. 프로덕션 환경에서 이것을 사용하면 많은 클래스/메소드 이름을 변경하려고 할 것입니다.

+0

이것은 가장 좋은 대답입니다 – gabba

+0

원래 코드가 어수선하게 흩어지는 것을 피하기 위해'Main'에 앞뒤 코드를 숨길 수 있습니까? –

+0

+1이 하나에 대한 - 나는 아마도 내 로깅을 내 콘솔 출력보다 다르게 작성하는 것을 선호하는 것처럼 이것을 사용하고 싶지는 모르겠지만 OP 문제를 상당히 처리합니다 깨끗하게. –

1

자동으로 콘솔 IO를 "섀도 잉"하는 것은 없으므로 직접해야합니다. 즉, 텍스트 파일을 열고 원하는 내용을 작성하는 것이 매우 쉽습니다.

경우에 따라 텍스트 파일을 열고 콘솔에 쓰거나 필요에 따라 콘솔에서 정보를 쓰면됩니다. 자세한 내용은 MSDN How to: Write To a Text File을 참조하십시오. 이 예제를하는 데 도움이

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\ProgramOutput.txt", true)) 
     { 
      file.WriteLine(name); 
     } 
+0

"콘솔 IO를 자동으로 '어둡게 할 수있는 방법은 없습니다.'글쎄, 이미 수행중인 작업 외에 파일에 쓰도록 표준 입출력 스트림을 변경할 수도 있습니다. – Servy

+0

@Servy 예 - 다시 자동으로 작성된 것이 아니며 내장되어 있습니다.하지만 네가 할 수있는 스트림 클래스를 만들 수 있습니다. 입력이 홀수가 되겠지만, 출력에 입력을 연결하면 ... –

+0

맞았습니다. 입력과 출력을 함께 갖는 것은 약간 이상했습니다. 로그 클래스를 만들어야 제대로 작동합니다. 그들이 따로 쓴다면 그것은 상상할 수 없을 것입니다. [링크] (http://stackoverflow.com/a/10743249/1159478) – Servy

1

당신은 당신이 Console를 통해 캡처 어떤 출력에 StreamWriter를 사용할 수

Console.WriteLine("Hello World"); 
FileStream fs = new FileStream("Test.txt", FileMode.Create); 
// First, save the standard output. 
TextWriter tmp = Console.Out; 
StreamWriter sw = new StreamWriter(fs); 
Console.SetOut(sw); 
Console.WriteLine("Hello file"); 
Console.SetOut(tmp); 
Console.WriteLine("Hello World"); 
sw.Close(); 

더 읽기에서 : http://msdn.microsoft.com/ru-ru/library/system.console.setin.aspx, http://msdn.microsoft.com/ru-ru/library/system.console.setout.aspx, http://msdn.microsoft.com/en-us/library/system.console.in.aspx, http://msdn.microsoft.com/ru-ru/library/system.console.out.aspx

관련 문제