我们不仅可以利用C#编写生成exe程序,同时还可以调用外部的exe程序。调用可以直接使用Process类:
[C#]
Process.Start("notepad");
[VB.NET]
Process.Start("notepad")
当然,值得注意的是“notepad”是Windows系统变量已经定义的一个程序(右键“我的电脑”=>“属性”=>“环境变量”)便可以看到notepad位于%winDir%\system32下,而这个路径被指定到了path中(由于“path”中路径极多,您可以选中path中的文本拷贝到一个文件中便可以窥察到此字符串路径)。
因此缺省路径的情况下,Start按照内置的某些exe或者com程序(比如dir,find等命令),或者在定义在Path中的系统变量搜索并启动程序,如全部路径查找后仍旧未发现该文件,则抛出“找不到指定文件”的异常。当然你完全可以指定“绝对”、”相对“路径进行启动自定义程序。
不过要是我们需要得到DOS程序的返回值呢?我们可以借助ProcessInfo+Process.Start。
说白了,ProcessInfo是一个用于设置启动exe程序的类。我们可以指定启动文件名称、路径以及参数。下面我们看一个例子:
例子——搜索C盘根目录(不包括子目录)下包含字符“a”的全部txt文件。
[C#]
ProcessStartInfo info = new ProcessStartInfo("find \"a\"","c:\\*.txt"); info.RedirectStandardOutput=true; info.UseShellExecute = false; Process p = Process.Start(info); StreamReader sr = p.StandardOutput; string s = sr.ReadToEnd(); Console.WriteLine(s); sr.Close();
[VB.NET]
Dim info As New ProcessStartInfo("find ""a""", "c:\*.txt") info.RedirectStandardOutput = True info.UseShellExecute = False Dim p As Process = Process.Start(info) Dim sr As StreamReader = p.StandardOutput Dim s As String = sr.ReadToEnd() Console.WriteLine(s) sr.Close()
第一行的构造函数传入两个参数——第一个参数是要启动的exe名称(find是内置的,无需指定路径),后面跟上要搜索的文本;第二个参数是“可选参数”(指定盘符和要搜索的文件类型)。
然后通过RedirectStandardOutput指定DOS命令执行完毕之后获取内容直接输出(必须指定,否则无法输出!),紧接着指定UseShellExecute为false(必须设置!因为需要把结果重定向输出到IO流,否则抛出异常!)
然后借助Process.Start传入这个类的实体信息,再通过StandardOutput读取结果即可。
其实,如果光凭借C#要做出类似“模糊搜索”并不容易,有时我们借助外部程序的调用得到结果也是一个很好的解决问题的办法。