C#输入输出重定向

当 Process 将文本写入其标准流中时,通常将在控制台上显示该文本。通过重定向 StandardOutput 流,可以操作或取消进程的输出。例如,可以筛选文本、用不同方式将其格式化,也可以将输出同时写入控制台和指定的日志文件中。有两种方式:同步、异步。

 

1.      先说同步方法,这种方法网上有很多例子,废话少说,贴上代码大家一看就明白了:

    Process process = new Process();

    process.StartInfo.FileName = "cmd.exe";

    process.StartInfo.UseShellExecute = false;   // 是否使用外壳程序 

    process.StartInfo.CreateNoWindow = true;   //是否在新窗口中启动该进程的值 

    process.StartInfo.RedirectStandardInput = true;  // 重定向输入流 

    //process.StartInfo.RedirectStandardOutput= true;  //重定向输出流 

    //process.StartInfo.RedirectStandardError= true;  //重定向错误流 

    string strCmd = "ping www.163.com /r/n";

    strCmd += "exit";

 

    process.Start();

    process.StandardInput.WriteLine(strCmd);

    string output = process.StandardOutput.ReadToEnd();//获取输出信息 

    process.WaitForExit();

    int n =process.ExitCode;  // n 为进程执行返回值 

    process.Close();

可以同步或异步读取重定向的 StandardOutput 流。ReadReadLine 和 ReadToEnd 等方法对进程的输出流执行同步读取操作。这些同步读取操作只有在关联的 Process 写入其StandardOutput 流或关闭该流后才能完成。

同步读取操作在读取 StandardOutput 流的调用方及写入该流中的子进程之间引入一个依赖项。这些依赖项可能导致产生死锁情况。调用方读取子进程的重定向流时依赖于该子进程。调用方将等待读取操作,直到子进程写入流或关闭流为止。子进程写入足够多的数据以填充重定向流的时间依赖于父进程。子进程将等待下一次写操作,直到父进程读取了全部流或关闭该流为止。当调用方和子进程相互等待对方完成操作时,就会产生死锁情况,使双方都无法继续执行操作。可以通过计算调用方和子进程之间的依赖项从而避免出现死锁情况。

2.      再来说一下异步方法

使用事件和委托,进程有2个事件OutputDataReceived、OutputDataReceived。
我们可以注册这2个事件,使该进程在往Output和error流中填充数据时,调用相应的事件响应函数,及时处理流中数据,从而避免流被填满而发生的死锁情况,在WaitForExit之前调用BeginOutputReadLine 或者BeginErrorReadLine 开始异步读取。此方法会为流输出启用一个指定的事件处理程序并立即返回到调用方,这样当流输出被定向到该事件处理程序时,调用方还可以执行其他操作。

注意

若要使用 StandardOutput,必须将 ProcessStartInfo.UseShellExecute 设置为 false,并且将 ProcessStartInfo.RedirectStandardOutput 设置为 true。否则,读取StandardOutput 流时将引发异常。

 

// using System.Diagnostics;

 

    // 运行新进程

    ProcessStartInfo startInfo =new ProcessStartInfo(exeName);

    startInfo.CreateNoWindow = true;   //不创建窗口

    startInfo.UseShellExecute = false;//不使用系统外壳程序启动,重定向输出的话必须设为false

    startInfo.RedirectStandardOutput = true//重定向输出,而不是默认的显示在dos控制台上

    startInfo.RedirectStandardError = true;

 

    try

    {

        Process process = Process.Start(startInfo);

        process.OutputDataReceived += (s, _e)=> Console.WriteLine(_e.Data);

        process.ErrorDataReceived += (s, _e) =>Console.WriteLine(_e.Data);

        //EnableRaisingEventstrue,进程退出时Process会调用下面的委托函数

        process.Exited += (s, _e) => Console.WriteLine("Exited with " + _process.ExitCode);

        process.EnableRaisingEvents = true;

        process.BeginOutputReadLine();

        process.BeginErrorReadLine();

        process.WaitForExit();

    }

    catch (Exception e)

    {

    Console.WriteLine(ex.Message);

}

 

 

3.      注意事项

不能对同一个重定向流混合使用异步和同步读取操作。在异步或同步模式下打开 Process 的重定向流后,对该流的所有进一步的读取操作都必须在同一模式下进行。例如,不要对StandardOutput 流调用BeginOutputReadLine 后接着调用ReadLine,反之亦然。但是,可以在不同的模式下读取两个不同的流。例如,可以先调用BeginOutputReadLine,然后再为StandardError 流调用 ReadLine

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言笔试常考知识点

1. const 关键字 a) const int a; b) int const a; c) const int *a; d) int * const a; e) int const * const a; 解析: a) a为一个int型变量,在它被定义时就应当对其初始化,因为以后就没有机会再去改变它了。 b) 与 a) 是一个意思&a…

苹果应用上架,一些信息的勾选(2017年4月27日)

1、分级的各种选项的选择全部选否 (我们公司是医疗相关的app,医疗的选项也是选择的否) 2、

jsp页面路径问题

jsp路径默认不是项目跟路径 一、 <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% String path request.getContextPath(); String basePath request.getScheme() "://" request.getServerName() …

C# 线程池ThreadPool

什么是线程池&#xff1f;为什么要用线程池&#xff1f;怎么用线程池&#xff1f; 1. 什么是线程池&#xff1f;.NET Framework的ThreadPool类提供一个线程池&#xff0c;该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。那么什么是线程池…

苹果应用上架,图片的要求(2017年4月27日)

看这个提示应该就明白了吧。 哈哈&#xff0c;我还是自己再说一遍加深一下印象吧&#xff1a;如果应用在各个尺寸iphone屏幕上面外观一样&#xff0c;就只准备5.5英寸的图就可以了&#xff1b;如果有所不同&#xff0c;就按照实际情况&#xff0c;准备不同屏幕尺寸的图片即可。…

jQuery操作checkbox

2012欧洲杯"死亡之组"小组出线的国家队是&#xff1a;<br> <inputtype"checkbox"name"nation"value"Germany">德国 <inputtype"checkbox"name"nation"value"Denmark">丹麦 <input…

android Instrumentation 转载

Android提供了一系列强大的测试工具&#xff0c;它针对Android的环境&#xff0c;扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程&#xff0c;但Android工具允许你为应用程序的各个方面进行更为复杂的测试&#xff0c;包括单元层面及框架层面。Android测试…

Linker command failed with exit code 1(use -v to see invocation)

Linker command failed with exit code 1(use -v to see invocation) 出现这个问题的原因是&#xff1a;工程当中存在相同的文件&#xff0c;找到该文件将其删除即可

【C#学习笔记】使用C#中的Dispatcher

form:https://www.jianshu.com/p/0714fc755988之前的文章说过了如何使用BackgroundWorker&#xff0c;今天要说的是WPF程序员处理多线程的另外一个方式 - Dispatcher当我们打开一个WPF应用程序即开启了一个进程&#xff0c;该进程中至少包含两个线程。一个线程用于处理呈现&…

流媒体 关键词解释

流媒体 流媒体是指采用流式传输的方式在网上播放的媒体格式, 是边传边播的媒体&#xff0c;是多媒体的一种! 然后就是大家需要了解的几个关键词 帧:视频是由很多连续图像组成, 每一帧就代表一幅静止的图像 GOP:&#xff08;Group of Pictures&#xff09;画面组&#xff0c;一个…

[C#] 等待启动的进程执行完毕

from: https://www.cnblogs.com/qqhfeng/p/4769524.html有能有时候我们启动了一个进程&#xff0c;必须等到此进程执行完毕&#xff0c;或是&#xff0c;一段时间&#xff0c; 关闭进程后再继续往下走。Example sample1 等待应用程序执行完毕 //等待应用程序执行完毕private vo…

html body标签

table table 属性&#xff1a; border &#xff1a;定义表格的边框宽度&#xff0c;默认为0&#xff0c;即无边框。<table border"1"> title &#xff1a;表格的提示信息&#xff0c;当鼠标移到表格上方时&#xff0c;所提示的信息。 cellpadding &#xff1a;…

创建字符串的方法

//创建一个字符串常量 NSString *str"字符串"; //创建一个空的字符对象 NSString *str1[[NSString alloc]init];//实例方法 NSString *str2[NSString string];//类方法 //快速创建一个字符串 NSString *str3[[NSString alloc]initWithString:"字符串"];//实…

DataReceivedEventHandler 委托 接收调用执行进程返回数据

https://msdn.microsoft.com/zh-cn/library/azure/system.diagnostics.datareceivedeventhandler备注创建 DataReceivedEventHandler 委托时&#xff0c;需要标识将处理该事件的方法。 若要将事件与事件处理程序关联&#xff0c;请将该委托的一个实例添加到事件中。 除非移除了…

coreData

CoreData使用 创建步骤流程 第一步先创建.xcdatamodeld文件&#xff08;New File -> iOS -> Core Data ->Data Model&#xff09; 屏幕快照 2016-07-07 下午10.40.16.png名字虽然可以任意取&#xff0c;但最好还是取和自己存储数据库名字一样的名字。这样可读性更高些…

命令行下mysql新建用户及分配权限

创建用户&#xff1a; CREATE USER usernamehost IDENTIFIED BY password; 说明:username – 你将创建的用户名, host – 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如 果想让该用户可以从任意远程主机登陆,可以使用通配符%. password – 该用户的登陆密…

PetaPoco初体验(转)

PetaPoco初体验&#xff08;转&#xff09; PetaPoco初体验&#xff08;转&#xff09;大部分转自&#xff1a; http://landyer.com/archives/138 PetaPoco C#微型ORM框架&#xff0c;基本无需配置&#xff0c;仅由单个cs文件构成&#xff0c;支持.net3.5 .net4.0。 截稿时Peta…

iOS当中的设计模式

代理模式 应用场景&#xff1a;当一个类的某些功能需要由别的类来实现&#xff0c;但是又不确定具体会是哪个类实现。 优势&#xff1a;解耦合 敏捷原则&#xff1a;开放-封闭原则 实例&#xff1a;tableview的 数据源delegate&#xff0c;通过和protocol的配合&#xff0c…

c#的dllimport使用方法详解

DllImport是System.Runtime.InteropServices命名空间下的一个属性类&#xff0c;其功能是提供从非托管DLL&#xff08;托管/非托管是微软的.net framework中特有的概念&#xff0c;其中&#xff0c;非托管代码也叫本地&#xff08;native&#xff09;代码。与Java中的机制类似&…

each函数循环数据表示列举,列举循环的时候添加dom的方法

var dotBox $(#bannerNum);var item <li></li>;var itemSize $(#bannerBack p).length;var dotBoxWidth itemSize*24;$(#bannerBack p).each(function () { dotBox.append(<li></li>); dotBox.find(li).eq(0).addClass(current);});这里要根…