关于C#中调用CMD进程处理文件应用程序卡死的问题
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.FileName = "cmd";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.StandardInput.AutoFlush = true;
for (i = 0; i < listView1.Items.Count; i++)
{
cmd.StandardInput.WriteLine(listView1.Items[i].SubItems[1].Text ); //I超过40的时候应用程序未响应????
}
cmd.StandardInput.WriteLine("exit");
string info = cmd.StandardOutput.ReadToEnd();
cmd.WaitForExit();
cmd.Close();
最好能给出程序 小弟新手 感激不尽 --------------------编程问答-------------------- 我嗒嗒的马蹄声是一个美丽的错误,我不是归人,是过客 --------------------编程问答-------------------- 如果程序改成这样 虽然不会卡死 但是info中只有第一次循环时的输出 为什么呢?
string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";--------------------编程问答-------------------- 没人知道么 纠结很久了。。 --------------------编程问答-------------------- 唉。。。。。 --------------------编程问答-------------------- System.Diagnostics.Process cmd = new System.Diagnostics.Process();
int i = 0,j = 60;
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.FileName = "cmd";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.StandardInput.AutoFlush = true;
StringBuilder info = new StringBuilder();
try
{
for (i = 0; i < j; i++)
{
cmd.StandardInput.WriteLine(s);
cmd.StandardInput.WriteLine("exit");
info.Append(cmd.StandardOutput.ReadToEnd());
}
cmd.StandardInput.Close();
cmd.StandardOutput.Close();
cmd.Close();
MessageBox.Show(info.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception m)
{
MessageBox.Show(m.ToString());
}
cmd.StartInfo.FileName = "cmd";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.StandardInput.AutoFlush = true;
for (i = 0; i < listView1.Items.Count; i++)
{
cmd.StandardInput.WriteLine(listView1.Items[i].SubItems[1].Text ); //I超过40的时候应用程序未响应????
}
string info = cmd.StandardOutput.ReadToEnd();
cmd.StandardInput.WriteLine("exit");
cmd.WaitForExit();
cmd.Close(); --------------------编程问答-------------------- cmd.StandardInput.WriteLine("exit");
cmd 退出了 --------------------编程问答--------------------
这样直接就卡死了。。 --------------------编程问答-------------------- 订阅一下错误处理和输出处理事件
我们不知道你是啥错,你必须清楚的知道你的错误是啥,我们才有排错的可能
这里不是直接try,而是定义poress的事件,相关事件说明请看msdn
http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process_events(v=vs.80).aspx --------------------编程问答-------------------- hack:我个人调试这类程序,其实是首先
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
把这端参数全改掉,你这里是不显示cmd窗口,不使用shell,同时输入重定向,错误重定向。这样的设置不利于调试,我个人首先会让他显示cmd,使用shell,也不截获IO,这样的好处是执行过程就显示在那里,一目了然,那里错了,一看就知道。等我调试无误了,在把参数改回成你这种“隐藏”滴 --------------------编程问答-------------------- 好吧 我重新说我的问题 大概的程序是这样的 调用控制台批量处理文件 就类似于调用csc编译器批量编译文件 然后读取cmd里的内容 弹出处理报告 现在的问题是如果文件名过长 文件过多(也就是下面测试代码中的s过长 j过大的情况)会导致程序卡死
下面是测试代码
string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
int i = 0,j = 60;
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.FileName = "cmd";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.StandardInput.AutoFlush = true;
StringBuilder info = new StringBuilder();
for (i = 0; i < j; i++)
{
cmd.StandardInput.WriteLine(s); //s过长j过大时 卡死
}
cmd.StandardInput.WriteLine("exit");
info.Append(cmd.StandardOutput.ReadToEnd());
cmd.StandardInput.Close();
cmd.StandardOutput.Close();
cmd.Close();
MessageBox.Show(info.ToString());
个人猜想可能是info.Append(cmd.StandardOutput.ReadToEnd());这句的原因 于是把测试代码改成了下面的这种 发现程序没有卡死了 但是info中的内容只是第一次循环的时候cmd中的内容 由于要对cmd里的内容进行处理 弹出处理报告 所有必须要获取到cmd里面的全部内容 情况大致就是这样。。。
string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";--------------------编程问答-------------------- 循环哪里不可以那么写的。
int i = 0,j = 60;
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.FileName = "cmd";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.StandardInput.AutoFlush = true;
StringBuilder info = new StringBuilder();
for(i = 0; i < j; i++)
{
cmd.StandardInput.WriteLine(s);
cmd.StandardInput.WriteLine("exit");
info.Append(cmd.StandardOutput.ReadToEnd());
}
cmd.StandardInput.Close();
cmd.StandardOutput.Close();
cmd.Close();
MessageBox.Show(info.ToString());
补充:.NET技术 , C#