使用Process.Start()和一些EXE程序(特别是cdrtfe)

时间:2013-09-15 18:32:26

标签: c# visual-studio-2010 cmd process.start

这个名为cdrtfe的开源软件(位于http://cdrtfe.sourceforge.net/)支持通过命令行刻录CD。当我使用cmd.exe以基本方式运行命令时,它正确刻录没有任何问题。但是当我在使用所需的参数进行解析时使用C#来创建进程时,cdrtfe会显示它好像正常工作但是它突然抱怨磁盘上没有空间。我还注意到它甚至没有检测到安装了CD刻录机驱动器。我不知道为什么当我通过C#代码调用它时它会以这种方式表现,但我在这里fence ...我似乎无法解决这个问题。

我甚至尝试用必要的命令写出一个bat文件,并使用Process调用调用bat文件,但它仍然失败并出现相同的错误。但是,手动运行它创建的同一个bat文件会显示正面结果并开始刻录。

有没有人为此获得解决方案?

以下是我使用的一小段代码: -

        String filesargument = "";

        for (int i = 0; i < m_Files.Count; i++)
        {
            filesargument += string.Format("\"{0}\"", m_Files[i].FullName);
            filesargument += " ";
        }

        string path = Path.Combine(
            System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
            , @"cdrtfe");

        var startInfo = new ProcessStartInfo();
        Process burnProcess = new Process();

        startInfo.Arguments = string.Format(@"/audio {0}/execute /exit /nosplash", filesargument);
        startInfo.UseShellExecute = true;
        startInfo.WorkingDirectory = path;
        startInfo.FileName = @"cdrtfe.exe";

        burnProcess.StartInfo = startInfo;

        burnProcess.Start();
        burnProcess.WaitForExit();

由于

编辑:抱歉缺乏细节。这是一个在VS2010中使用admin privalges开发的WPF应用程序。由于我还在调试,代码在同一帐户下运行。

编辑2:我只是尝试运行没有任何参数的exe只是为了正常执行它并给出类似的结果。它只是拒绝检测我的CD / DVD驱动器。

4 个答案:

答案 0 :(得分:0)

我知道您的问题与实例ProcessStartInfo的错误配置有关。 尝试使用静态方法Process.Start(string fileName,string arguments)

答案 1 :(得分:0)

首先验证输入字符串了吗?它的格式是否正确?其次,您需要将RaisingEvents设置为True并将Exe输出重定向到Handler,您可以在其中看到Application GUI中的Output。添加评论如果您需要进一步的帮助。在这方面,我将很乐意为您提供更多帮助。

答案 2 :(得分:0)

我已为您编写示例代码,希望这会对您有所帮助。请根据您的计划纠正它。当你得到解决方案时,Plz别忘了投票。

private ProcessStartInfo psi;
private Process cmd;
private delegate void InvokeWithString(string text);
public void StartBurning()
{
string filePath = "Your Exe path";
psi = new ProcessStartInfo(filePath);
System.Text.Encoding systemencoding =     System.Text.Encoding.GetEncoding(Globalization.CultureInfo.CurrentUICulture.TextInfo.OEMCodePage);

var _with1 = psi;

_with1.Arguments = "Your Input String";
_with1.UseShellExecute = false;
// Required for redirection
_with1.RedirectStandardError = true;
_with1.RedirectStandardOutput = true;
_with1.RedirectStandardInput = true;
_with1.CreateNoWindow = false;
_with1.StandardOutputEncoding = systemencoding;
// Use OEM encoding for console applications
_with1.StandardErrorEncoding = systemencoding;

// EnableraisingEvents is required for Exited event
cmd = new Process {
    StartInfo = psi,
    EnableRaisingEvents = true
};
cmd.ErrorDataReceived += Async_Data_Received;
cmd.OutputDataReceived += Async_Data_Received;
cmd.Exited += processExited;
cmd.Start();
myProcList.Add(cmd.Id);
cmd.BeginOutputReadLine();
cmd.BeginErrorReadLine();
  }
  private void Async_Data_Received(object sender, DataReceivedEventArgs e)
  {
this.Invoke(new InvokeWithString(Sync_Output), e.Data);
   }
  private void Sync_Output1(string text)
   {
 //This Textbox needs to place at the GUI to check the output Log from your exe. 
txtLog.AppendText(text + Environment.NewLine);
  }
  private void processExited(object sender, EventArgs e)
  {

 this.BeginInvoke(new Action(() => { MessageBox.Show("The burn process   Terminated.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }));
   }

答案 3 :(得分:0)

我使用了@ZahidKakar发布的代码并且它工作得很好但是它没有解决cdrtfe的问题。我已经决定使用CDBurnerXP(也支持命令行刻录甚至流回进度)并且它运行良好。