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#に関する本を書いています。ブックのファイル サイズをできるだけ小さくしたいので、コンソール ウィンドウのスクリーン ショットをブックに添付することは避けたいと考えています。代わりに、コンソール ウィンドウの内容を示すテキスト ファイルを書籍に添付したいと考えています。(テキスト ファイルを作成するための) コードを追加すると、コード例が複雑になり、読者が混乱することになります。

4

4 に答える 4

2

さて、ここでのアイデアは、コンソールの入出力用のリーダー/ライターを以前と同じように変更するだけでなく、ログ ファイルにも書き出すことです。ファイル名/パスをパラメーターとして受け取るようにおそらく拡張する必要がある Log クラスを作成しましたが、出力ストリームを同期できるようにすることが重要でした。

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();
    }
}

これらのクラスを作成したので、 の開始時に次のことを行いますMain

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

の最後にもこれが必要ですMain:

log.Close();

それはやや迅速で汚い書き込みです。これを本番環境で使用する場合、多くのクラス/メソッド名を変更したくなるでしょう。

于 2012-05-24T18:29:49.520 に答える
1

コンソールIOを自動的に「シャドウ」するものはないため、これは自分で行う必要があります。そうは言っても、テキストファイルを開いて好きなものを書くのはかなり簡単です。

あなたの場合は、テキストファイルを開いて、コンソールに書き込んだり、必要に応じてコンソールから読み取ったりするときに、そのファイルに情報を書き込んでください。詳細については、MSDNの「方法:テキストファイルへの書き込み」を参照してください。

于 2012-05-24T18:02:21.530 に答える
1

を使用して、StreamWriterキャプチャしたものをConsole:を介して出力できます。

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\ProgramOutput.txt", true))
        {
            file.WriteLine(name);
        }  
于 2012-05-24T18:03:24.120 に答える
0

この例は、次の場合に役立ちます。

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 を 参照してください。 aspxhttp://msdn.microsoft.com/en-us/library/system.console.in.aspxhttp://msdn.microsoft.com/ru-ru/library/system.console.out.aspx

于 2012-05-24T18:25:54.213 に答える