C# Process.Start捕获所有文件名/参数代码

C# Process.Start捕获所有文件名/参数代码,c#,C#,我有一些代码需要改进。它使用Process.Start,应该能够处理任何输入和参数,并且仍然工作。 我想我还没有涵盖所有的基础。有人能提出更好/更彻底的方法吗 ToMaybeUri是一种尝试创建Uri的扩展方法 ToValidMailToArgument是一个添加“attachments=”的扩展方法 IsValidEmail是一种扩展方法,它对电子邮件地址执行正则表达式 public static void RunProcess(string fileName, string Params)

我有一些代码需要改进。它使用Process.Start,应该能够处理任何输入和参数,并且仍然工作。 我想我还没有涵盖所有的基础。有人能提出更好/更彻底的方法吗

ToMaybeUri是一种尝试创建Uri的扩展方法

ToValidMailToArgument是一个添加“attachments=”的扩展方法

IsValidEmail是一种扩展方法,它对电子邮件地址执行正则表达式

 public static void RunProcess(string fileName, string Params)
    {
        var useProcessStart = true;

        var validFile = false;
        var validDir = false;
        var validEmail = false;
        var validURL = false;

        var proc = new Process();
        var info = new ProcessStartInfo(fileName);
        info.UseShellExecute = true;
        info.Arguments = Params;

        //try catches here in case the syntax of the string has invalid characters for dir/file
        try
        {
            var di = new DirectoryInfo(fileName);
            validDir = di == null ? false : di.ExistsNow();
        }
        catch (Exception ex) { }

        try
        {
            var fi = new FileInfo(fileName);
            validFile = fi == null ? false : fi.Exists();
        }
        catch (Exception ex) { }

        if (Params == "")
        {

            if (validFile)
            {
                if (Path.GetExtension(fileName).ToUpper() == ".CHM")
                {

                    var helpProvider1 = new HelpProvider();
                    helpProvider1.HelpNamespace = fileName;

                    Help.ShowHelp(Application.OpenForms[0], helpProvider1.HelpNamespace);

                    MessageBox.Show(msg);

                    return;
                }
            }
            else if (validDir)
            {
                //skip
            }
            else if (fileName.IsValidEmail())
            {
                validEmail = true;                  
                info.FileName = "mailto:" + info.FileName;
                info.Arguments = "";

            }
            else if (fileName.IsValidUrl())
            {
                validURL = true;
                info.FileName = fileName.ToMaybeUri().Value.ToString();
                info.Arguments = "";
            }
            else
            {
                MessageBox.Show(fileName + " does not exist.");
            }
        }
        else
        {
            //and has params
            if (Path.GetExtension(fileName).ToUpper() == ".PDF" && Params.ToLower().StartsWith("p"))
            {
                int pageNum = 0;
                string pageNumString = Grazer.Utilities.Strings.Right(Params, Params.Length - 1);
                int.TryParse(pageNumString, out pageNum);

                //PDFLocation = "/A \"page=" + pageNum + "=OpenActions\" \"" + ssGlobals.ssStartDir + "\\Example.pdf\""
                string app = GrRegistry.GetApplicationFromExtension(".PDF");

                if (Path.GetFileNameWithoutExtension(app).ToUpper() == "ACROBAT" || Path.GetFileNameWithoutExtension(app).ToUpper() == "ACRORD32")
                {
                    string PDFLocation = String.Format("/A \"page={0}=OpenActions\" \"{1}\"", pageNum, Path.GetFullPath(fileName));

                    info = new ProcessStartInfo(app);
                    info.Arguments = PDFLocation;
                }
            }
            else if (fileName.IsValidEmail())
            {
                validFile = false;

                try
                {
                    var fi = new FileInfo(info.Arguments);
                    validFile = fi == null ? false : fi.ExistsNow();
                }
                catch (Exception ex) { }

                info.FileName = String.Format("mailto:{0}{1}", fileName, new FileInfo(info.Arguments).ToValidMailToArgument());
                info.Arguments = "";                  
            }
        }

        if (useProcessStart)
        {
            proc.StartInfo = info;

            try
            {
                if (validURL || validFile || validDir || validEmail)
                    proc.Start();
            }
            catch (Exception ex)
            {
                switch (ex.Message)
                {
                    case "No process is associated with this object.":
                        break;
                    default:
                        MessageBox.Show(ex);
                        if (info.Arguments.ToEmptyIfNull().Length > 0)
                            MessageBox.Show(String.Format("{0} could not be opened with parameters: {1}", info.FileName, info.Arguments));
                        else
                            MessageBox.Show(String.Format("{0} could not be opened", info.FileName));
                        break;
                }
            }
        }
    }

首先,您不想接受异常。在捕获块上,确保捕获异常后正在执行某些操作。另外,找出您在try块中调用的方法可以引发哪些特定异常,并捕获这些特定异常,如下所示:

try
{
    SomeMethod();
}
catch (SpecificExceptionType1)
{
    //do something based on what this exception means
}
catch (SpecificExceptionType2)
{
    //ditto here
}
catch
{
    //handle unexpected exceptions here
}
而且,这闻起来有点像家庭作业——也许是实现了一个命令shell?如果是这样,请将其重新标记为家庭作业。如果没有,就告诉我把它塞进去