如果我们编译以下代码并运行生成的应用程序,我们将通过输入我们的名称,按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 :(得分: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();
这是一个有点快速和肮脏的写作。如果你在生产中使用它,你可能想要改变很多类/方法名称。
答案 1 :(得分:1)
没有任何东西可以自动“遮蔽”你的控制台IO,所以你必须自己做。话虽这么说,打开一个文本文件并写下你想要的任何东西都相当容易。
在您的情况下,只需打开一个文本文件,并在写入控制台时将信息写入其中,并根据需要从控制台中读取。有关详细信息,请参阅MSDN的How to: Write To a Text File。
答案 2 :(得分:1)
您可以使用StreamWriter
输出您通过Console
:
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\ProgramOutput.txt", true))
{
file.WriteLine(name);
}
答案 3 :(得分: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.aspx, http://msdn.microsoft.com/en-us/library/system.console.in.aspx, http://msdn.microsoft.com/ru-ru/library/system.console.out.aspx