• [C#]使用Process的StandardInput与StandardOutput写入读取控制台数据



    本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!


    开发工具:VS2017

    语言:C#

    DotNet版本:.Net FrameWork 4.0及以上

    一、为了演示使用程序读取控制台数据,现在需要编写一个控制台程序,代码如下:

    using System;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                string content = Console.ReadLine();
                if(content.ToUpper() == "TEST")
                {
                    Console.WriteLine("You have type correctly.
    Congratulation!");
                }
                else
                {
                    Console.WriteLine("Sorry,Uncorrectly!
    See you later.");
                }
            }
        }
    }

    这段代码的作用是:

    1)在控制台输出“Hello World!”;

    2)当输出“Test”(不管大小写),则输出:

    You have type correctly.

    Congratulation!

    3)当输出其他时,则输出:

    Sorry,Uncorrectly!

    See you later.

    以上是必备的应用程序,如果不使用该程序,可以使用System32文件夹下的cmd.exe来当做控制台应用程序;

    二、将以上生成的程序Test.exe拷贝到D盘根目录下;

    三、新建一个控制台应用程序(MainConsoleApp),来操作之前的控制台应用程序,并编写以下代码:

    using System;
    using System.Diagnostics;
    
    namespace MainConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                Process proc = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = @"D:	est.exe",
                        UseShellExecute = false,
                        CreateNoWindow = true,
                        RedirectStandardInput = true,
                        RedirectStandardOutput = true
                    }
                };
                proc.Start();
                proc.StandardInput.WriteLine("Test");
                string line = null;
                while (!proc.StandardOutput.EndOfStream)
                {
                    line +=  proc.StandardOutput.ReadLine() + Environment.NewLine;
                }
                Console.WriteLine(line);
                proc.WaitForExit();
    
                //再次启动
                proc.Start();
                proc.StandardInput.WriteLine("T");
                string content = proc.StandardOutput.ReadToEnd();
                Console.WriteLine(content);
                proc.WaitForExit();
    
                Console.ReadKey();
            }
        }
    }

    代码作用简介:

    ProcessStartInfo.FileName:要启动的应用程序名称;

    ProcessStartInfo.UseShellExecute:要重定向 IO流,Process对象必须将 UseShellExecute属性设置为false;

    ProcessStartInfo.CreateNoWindow:是否以没有窗体的模式创建应用程序,默认为false,即有窗体,如为true,即隐藏窗体。在这里不设置该值也可以;

    ProcessStartInfo.RedirectStandardInput:标准输入流的重定向,重定向至Process,我们可以通过Process.StandardInput.WriteLine将数据写入标准流;

    ProcessStartInfo.RedirectStandardOutput:与RedirectStandardInput相反,这是标准输出流的重定向,我们可以通过Process.RedirectStandardOutput.ReadLine等方法读取标准流数据。

    Process.StandardInput.WriteLine:将数据写入标准流;

    Process.StandardOutput.ReadLine(或ReadToEnd):从标准流读取数据。

    四、该程序将向Test.exe写入数据,并从Test.exe读回数据,这里使用了重定向技术,运行结果如下:

    我们可以看到,原来是Test.exe的程序,所有的数据操作都进行了重定向,直接在MainConsoleApp.exe进行了输入输出。

    这个技术不仅仅可以用于以上的示例,还可以用于其他具有控制台输入输出的程序,如cmd.exe,这里不进行举例,自己进行试验即可。


     我的博客即将同步至腾讯云+社区,邀请大家一同入驻。


  • 相关阅读:
    设计模式之代理模式
    Java8内存模型—永久代(PermGen)和元空间(Metaspace)
    使用jconsole分析内存情况-JVM
    JVM(Java虚拟机)优化大全和案例实战
    JVM调优总结 -Xms -Xmx -Xmn -Xss
    聊聊jvm的PermGen与Metaspace
    Jconsole
    【Java VisualVM】使用 VisualVM 进行性能分析及调优
    JAVA基础(10)——IO、NIO
    JAVA基础(9)——容器(3)——并发容器
  • 原文地址:https://www.cnblogs.com/cncc/p/8021698.html
Copyright © 2020-2023  润新知