Process.Start捕获所有FileName / Arguments代码

时间:2011-04-01 05:13:40

标签: c#

我有一些我想改进的代码。它使用Process.Start并且应该能够处理任何参数的任何输入,并且仍然可以工作。 我认为我没有涵盖所有基础。任何人都可以建议更好/更彻底的方法吗?

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

ToValidMailToArgument是一种添加“attachments =”

的扩展方法

IsValidEmail是一种在电子邮件地址上执行RegEx的扩展方法。

 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;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

首先,您不想吞下异常。在你的catch块上,确保你在捕获异常后做了些什么。另外,找出您在try块中调用的方法可以抛出哪些特定异常并捕获这些特定异常,如下所示:

try
{
    SomeMethod();
}
catch (SpecificExceptionType1)
{
    //do something based on what this exception means
}
catch (SpecificExceptionType2)
{
    //ditto here
}
catch
{
    //handle unexpected exceptions here
}

此外,这有点像家庭作业 - 可能是实施命令shell?如果是这样,请将其重新作为家庭作业。如果没有,请告诉我填写它。