2012-05-24 11 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分かかります。 1つを書く。 – 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

あなたは正しいです。入力と出力を一緒にするのはちょっと奇妙でした。私はそれがうまく動作するようにLogクラスを作る必要がありました。彼らが別々に書かれていたとすれば、それは私が想像するところに行くことができない。 [リンク](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/en-us/library/system.console.in.aspxhttp://msdn.microsoft.com/ru-ru/library/system.console.out.aspx

関連する問題