我试图获取输出以显示我的机器上当前打开的文档,但无论如何它都会返回NULL. StringCollection values = new StringCollection();var proc = new Process{ StartInfo = new ProcessStartInfo { FileName = "openfiles.exe", A
StringCollection values = new StringCollection();
var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "openfiles.exe",
Arguments = "/query /FO CSV /v",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
string line = proc.StandardOutput.ReadLine();
values.Add(line);
}
foreach (string sline in values)
MessageBox.Show(sline);
编辑:
在进一步审查期间,我发现我遇到了一个异常问题.在我的诊断运行期间,我得到以下内容:
Proc.BasePriority是System.InvalidOperationException类型的异常
编辑:
尝试将代码拉为:
string val = proc.StandardOutput.ReadToEnd(); MessageBox.Show(val);
返回时也是NULL值,并且proc甚至在proc.start();之后仍然有错误.
您必须同时读取标准输出和标准错误流.这是因为你无法从同一个线程中读取它们.要实现这一点,您必须使用将在单独的线程上调用的eventhandlers.
将代码编译为anycpu,因为openfiles有32位和64位变体.如果架构不匹配,它可能找不到可执行文件.
从错误流中读取的行前缀为! >所以他们在输出中脱颖而出.
StringCollection values = new StringCollection();
var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "openfiles.exe",
Arguments = "/query /FO CSV /v",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = false
}
};
proc.Start();
proc.OutputDataReceived += (s,e) => {
lock (values)
{
values.Add(e.Data);
}
};
proc.ErrorDataReceived += (s,e) => {
lock (values)
{
values.Add("! > " + e.Data);
}
};
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit();
foreach (string sline in values)
MessageBox.Show(sline);
