2 c# notepad console-application
我在互联网上搜索了许多将控制台应用程序输出屏幕存储在.txt文件中.我得到了解决方案,但我没有得到预期的结果.问题是未在控制台屏幕中显示的文本存储在记事本文件中.但控制台屏幕中显示的文本未存储在记事本文件中.
例如,
using System;
using System.IO;
static void Main(string[] args)
{
Console.WriteLine("Text which is displayed in the the console output screen ");
FileStream filestream = new FileStream("notepad.txt", FileMode.Create);
var streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
Console.SetOut(streamwriter);
Console.SetError(streamwriter);
Console.WriteLine("Text which is not displayed in the console output screen but it store in the the .txt file");
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,
该行Console.WriteLine("Text which is displayed in the the console output screen ");仅显示在控制台屏幕中,但未存储在记事本文件中
但该行Console.WriteLine("Text which is not displayed in the console output screen but it store in the the .txt file");不会显示在控制台应用程序屏幕中,而是存储在记事本文件中.
我需要存储控制台屏幕中显示的所有内容,即使用户也提供了详细信息.
我该怎么做?
由于我是初学者,我希望答案很简单.
提前致谢!
您只能将一个输出流分配给控制台.所以你需要一个同时执行这两者的流,写入屏幕和文件.
您始终可以获得控制台的标准输出流,如下所示:
Stream consoleOutput = Console.GetStandardOutput();
Run Code Online (Sandbox Code Playgroud)
如果要使用多个输出,则必须创建一个新的流类,将数据分发到多个流.为此,您将不得不覆盖Stream该类(不是完整的实现,您还必须实现所有其他抽象成员Stream):
public class MultiStream : Stream {
private readonly Stream[] m_children;
public MultiStream(params Stream[] children) {
m_children = children;
}
public override Write(byte[] buffer, int offset, int count) {
foreach(Stream child in m_children) {
child.Write(buffer, offset, count);
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
现在您可以使用您MultiStream的输出路由到多个流:
FileStream filestream = new FileStream("notepad.txt", FileMode.Create);
MultiStream outStream = new MultiStream(filestream, Console.GetStandardOutput());
var streamwriter = new StreamWriter(outStream);
Run Code Online (Sandbox Code Playgroud)
如果你可以替换Console.WriteLine,你可以使用更简单的方法(假设你的streamwriter变量是可访问的):
public void WriteLineToScreenAndFile(string text) {
Console.WriteLine(text);
streamwriter.WriteLine(text);
}
Run Code Online (Sandbox Code Playgroud)
您可以通过调用该方法替换对Console.WriteLine的所有调用.
| 归档时间: |
|
| 查看次数: |
1655 次 |
| 最近记录: |