Process.Start() 报错:系统找不到指定文件

news2024/9/21 14:34:21

今天在工作中遇到调用浏览器打开页面,代码报错:System.ComponentModel.Win32Exception:“系统找不到指定的文件。”
代码如下:

                ProcessStartInfo info = new ProcessStartInfo(@"chrome.exe");
                // 打开一个新的chrome独立窗体启动
                info.Arguments = " --new-window  --start-maximized  --kiosk  " + m_Url;
                // 使用环境变量,可以读取配置了环境变量文件夹内的chrome.exe
                info.UseShellExecute = true;
                info.WindowStyle = ProcessWindowStyle.Minimized;
                System.Diagnostics.Process.Start(info);

这段代码,若不报错,有着苛刻的条件,如
1.安装了chrome后,chrome自动或个人手动把chrome.exe的文件夹路径配置到环境变量Path里。如下:
在这里插入图片描述
2.安装的chrome可能在System32文件夹内产生Chrome.exe
这也就是,写了这样的代码有的机器能正常调出浏览器,有些则会报错的原因。

经过多次尝试,我们使用Win+R运行Chrome.exe,在任何情况都可以调出浏览器,可能它会通过注册表获取浏览器的安装路径,找到Chrome.exe打开,而我们的Process.Start(info)却没有这么智能。所以我们的解决方案就是要通过注册表找到浏览器的绝对路径,然后打开它。
以下是helper类

  public static class BrowserHelper
    {
        #region 打开浏览器
        /// <summary>
        /// 打开浏览器
        /// </summary>
        /// <param name="url">uri地址</param>
        /// <param name="browser">浏览器类型</param>
        public static void OpenBrowserUrl(string url, BrowserType browser = BrowserType.Default)
        {
            //FuncLog4Helper.Error($"调用浏览器:{browser.ToString()} url地址:{url}", "IPNW");
            try
            {
                switch (browser)
                {
                    case BrowserType.Chrome:
                        OpenChrome(url);
                        break;
                    case BrowserType.InternetExplorer:
                        OpenInternetExplorer(url);
                        break;
                    case BrowserType.FireFox:
                        OpenFireFox(url);
                        break;
                    case BrowserType.Default:
                    default:
                        OpenDefaultBrowserUrl(url);
                        break;
                }
            }
            catch (Exception ex)
            {
                LoggerHelper.Error("调用浏览器报错", ex);
            }
        }
        #endregion

        #region 调用谷歌浏览器
        /// <summary>
        /// 调用谷歌浏览器
        /// </summary>
        /// <param name="url">打开网页的链接</param>
        private static void OpenChrome(string url)
        {
            try
            {
                string appPath = GetChromePath();
                var result = default(Process);
                if (!string.IsNullOrWhiteSpace(appPath) && File.Exists(appPath))
                    result = Process.Start(appPath, url);
                if (result == null)
                {
                    result = Process.Start("chrome.exe", url);
                    if (result == null)
                    {
                        OpenDefaultBrowserUrl(url);
                    }
                }
            }
            catch
            {
                // 出错调用用户默认设置的浏览器,还不行就调用IE
                OpenDefaultBrowserUrl(url);
            }
        }
        #endregion

        #region 用IE打开浏览器
        /// <summary>
        /// 用IE打开浏览器
        /// </summary>
        /// <param name="url"></param>
        private static void OpenInternetExplorer(string url)
        {
            try
            {
                Process.Start("iexplore.exe", url);
            }
            catch (Exception ex)
            {
                LoggerHelper.Error("调用浏览器报错", ex);
                // IE浏览器路径安装:C:\Program Files\Internet Explore
                try
                {
                    string executeName = "iexplore.exe";
                    string iePath = $@"C:\Program Files\Internet Explorer\{executeName}";
                    if (!File.Exists(iePath))
                    {
                        iePath = $@"C:\Program Files (x86)\Internet Explorer\{executeName}";
                        if (!File.Exists(iePath))
                        {
                            iePath = GetExecutePath(executeName);
                            if (!File.Exists(iePath))
                                iePath = string.Empty;
                        }
                    }

                    if (string.IsNullOrWhiteSpace(iePath))
                    {
                        if (MessageBox.Show(@"系统未安装IE浏览器,是否下载安装?", null, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                        {
                            // 打开下载链接,从微软官网下载
                            OpenDefaultBrowserUrl("http://windows.microsoft.com/zh-cn/internet-explorer/download-ie");
                        }
                        return;
                    }

                    ProcessStartInfo processStartInfo = new ProcessStartInfo
                    {
                        FileName = iePath,
                        Arguments = url,
                        UseShellExecute = false,
                        CreateNoWindow = true
                    };
                    Process.Start(processStartInfo);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
        }
        #endregion

        #region 打开系统默认浏览器(用户自己设置了默认浏览器)
        /// <summary>
        /// 打开系统默认浏览器(用户自己设置了默认浏览器)
        /// </summary>
        /// <param name="url"></param>
        private static void OpenDefaultBrowserUrl(string url)
        {
            Process result = null;
            try
            {
                result = Process.Start(url);
            }
            catch (Exception ex)
            {
                LoggerHelper.Error("调用浏览器报错", ex);
                OpenInternetExplorer(url);
            }
        }
        #endregion

        #region 火狐浏览器打开网页
        /// <summary>
        /// 火狐浏览器打开网页
        /// </summary>
        /// <param name="url"></param>
        private static void OpenFireFox(string url)
        {
            try
            {
                var result = default(Process);
                string executeName = "firefox.exe";
                string appPath = GetExecutePath(executeName);
                if (!string.IsNullOrWhiteSpace(appPath) && File.Exists(appPath))
                {
                    result = Process.Start(appPath, url);
                }
                if (result == null)
                {
                    //64位注册表路径
                    var openKey_64 = @"SOFTWARE\Wow6432Node\Mozilla\Mozilla Firefox";
                    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(openKey_64);
                    appPath = registryKey?.GetValue(string.Empty)?.ToString();
                    if (string.IsNullOrWhiteSpace(appPath))
                    {
                        //32位注册表路径
                        var openKey_32 = @"SOFTWARE\Mozilla\Mozilla Firefox";
                        registryKey = Registry.LocalMachine.OpenSubKey(openKey_32);
                        appPath = registryKey?.GetValue(string.Empty)?.ToString();
                    }
                    if (!string.IsNullOrWhiteSpace(appPath))
                        result = Process.Start(appPath, url);
                }
                // 谷歌浏览器就用谷歌打开,没找到就用系统默认的浏览器
                // 谷歌卸载了,注册表还没有清空,程序会返回一个"系统找不到指定的文件。"的bug
                if (result == null)
                {
                    result = Process.Start(executeName, url);
                    if (result == null)
                    {
                        OpenDefaultBrowserUrl(url);
                    }
                }
            }
            catch
            {
                // 出错调用用户默认设置的浏览器,还不行就调用IE
                OpenDefaultBrowserUrl(url);
            }
        }
        #endregion

        #region 注册表中获取可执行文件路径
        /// <summary>
        /// 注册表中获取可执行文件路径
        /// </summary>
        /// <param name="executeName">可执行文件名称</param>
        /// <returns></returns>
        public static string GetExecutePath(string executeName)
        {
            if (string.IsNullOrWhiteSpace(executeName))
                return string.Empty;
            string strKeyName = string.Empty;
            string appPath = string.Empty;
            if (executeName.IndexOf(".exe", StringComparison.OrdinalIgnoreCase) == -1)
                executeName = $"{executeName}.exe";
            string softPath = $@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{executeName}";
            RegistryKey regSubKey = Registry.LocalMachine.OpenSubKey(softPath, false);
            if (regSubKey != null)
            {
                object objResult = regSubKey.GetValue(strKeyName);
                RegistryValueKind regValueKind = regSubKey.GetValueKind(strKeyName);
                if (regValueKind == RegistryValueKind.String)
                {
                    appPath = objResult?.ToString();
                }
            }
            return appPath;
        }
        #endregion

        #region 获取Chorme浏览器路径
        /// <summary>
        /// 获取Chorme浏览器路径
        /// </summary>
        /// <returns></returns>
        public static string GetChromePath()
        {
            string chormePath = string.Empty;
            try
            {
                string chromeAppKey = @"\Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe";
                chormePath = (Registry.GetValue("HKEY_LOCAL_MACHINE" + chromeAppKey, "", null) ?? Registry.GetValue("HKEY_CURRENT_USER" + chromeAppKey, "", null))?.ToString();
                if (!string.IsNullOrWhiteSpace(chormePath) && File.Exists(chormePath))
                    return chormePath;
                chormePath = $@"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\Google\Chrome\Application\chrome.exe";
                //win10默认安装路径
                if (!string.IsNullOrWhiteSpace(chormePath) && File.Exists(chormePath))
                    return chormePath;
                string executeName = "chrome.exe";
                chormePath = GetExecutePath(executeName);
                if (!string.IsNullOrWhiteSpace(chormePath) && File.Exists(chormePath))
                    return chormePath;
                // 64位注册表路径
                var openKey_64 = @"SOFTWARE\Wow6432Node\Google\Chrome";
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(openKey_64);
                chormePath = registryKey?.GetValue(string.Empty)?.ToString();
                if (!string.IsNullOrWhiteSpace(chormePath) && File.Exists(chormePath))
                    return chormePath;

                var openKey_32 = @"SOFTWARE\Google\Chrome";
                registryKey = Registry.LocalMachine.OpenSubKey(openKey_32);
                chormePath = registryKey?.GetValue(string.Empty)?.ToString();
                if (!string.IsNullOrWhiteSpace(chormePath) && File.Exists(chormePath))
                    return chormePath;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
            return chormePath;
        }
        #endregion
    }
    public enum BrowserType
    {
        [Description("客户默认浏览器")]
        Default = 0,
        [Description("谷歌浏览器")]
        Chrome = 1,
        [Description("IE浏览器")]
        InternetExplorer = 2,
        [Description("火狐浏览器")]
        FireFox = 3,
    }

以下是调用代码

BrowserHelper.OpenBrowserUrl("www.baidu.com", BrowserType.Chrome);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TI DSP的中断

F28069的中断数是96个&#xff0c;分为12组 The PIE block can support 96 individual interrupts that are grouped into blocks of eight.Each group is fed into one of 12 core interrupt lines (INT1 to INT12) 比如常用的的CPU0定时器这个中断就是在第一组的第7个&#x…

Java项目:SSM新闻网站管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,新闻管理,类别管理,用户管理,管理员管理,广告管理等功能。 用户角色包含以下功能&#xff1a;…

水溶性,非反应性,含有游离羧酸功能----cy染料 近红外荧光亲水CY7 COOH;Sulfo-CY5/CY7 COOH

近红外荧光亲水染料Sulfo-Cyanine7 carboxylic acid Sulfo-Cyanine7 carboxylic acid&#xff1b;SSulfo-Cyanine7 COOH;Sulfo-CY7 COOH;磺酸基-Cy7羧酸;磺化Cy7羧酸 产品名称&#xff1a;磺酸基-Cy3 羧酸 英文名称&#xff1a;Sulfo-Cyanine7 carboxylic acid 其他名称&#…

数据趣事:豪掷2200亿美元举办的世界杯有多精彩!世界杯趣事你知道哪些

2022卡塔尔世界杯正如火如荼的进行着&#xff0c;此次的卡塔尔世界杯也是中东和阿拉伯地区首次举办&#xff0c;为此卡塔尔更是豪掷2200亿美元&#xff0c;远超历届主办国。 本届世界杯共有32支来自不同国家的队伍&#xff0c;他们都有一个共同的奋斗目标——捧起大力神杯&…

[附源码]计算机毕业设计通用病例管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java网上私厨到家服务平台dp28s

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…

消息队列的持久化、分发策略、高可用和高可靠

原文&#xff1a;消息队列 一、什么是消息的持久化&#xff1f; 简单来说就是将数据存入磁盘&#xff0c;而不是存在内存中随服务器重启断开而消失&#xff0c;使数据能够永久保存。 常见的持久化方式 二、消息队列的分发策略 MQ消息队列有如下几个角色 1&#xff1a;生产…

CNCC技术论坛|分布式数据库HTAP的探索与实践

本文转载自微信公众号“中国计算机学会” 编者按 12月8-10日&#xff0c;中国计算机协会即将全线上举办CNCC2022&#xff0c;大会覆盖118个计算行业、人工智能、云计算、教育、安全等30个热门专业领域的技术论坛&#xff0c;700余位专家将着力探讨计算技术与未来宏观发展趋势&a…

多通道LMMSE图像超分辨复原方法研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、多通道LMMSE复原算法✳️ 三、实验验证✳️ 四、参考文献✳️ 五、Matlab程序获取与验证✳️ 一、引言 数字图像处理又称为计算机图像处理&#xff0c;是指运用计算机处理平台及相关理论知识&#xff0c;将图像信号转化为数字信号&#…

G120变频器输入输出端子功能定义配置方法及示例

G120变频器输入输出端子功能定义配置方法及示例 1. 数字量输入功能(适用机型:CU240B-2(DP)/CU240E-2(DP/PN)/CU250S-2(DP/PN)) CU240B-2提供4路数字量输入,CU240E-2提供6路数字量输入,CU250S-2提供11路数字量输入和4路可作为输入/输出的数字量端子。在有必要时,也可以将模…

Splunk UBA 导入IDS - firesight 数据

1: 先看一下Splunk IDS 文档: Splunk UBA category to Splunk CIM field mapping reference - Splunk Documentation 里面清楚的记录着哪些是必须字段: 2: 下面开始配这些字段SPL: 发现就是报如下的错: 3: 最后把tag 的字段增加:attack_ids 就可以了,真是奇怪: index…

leecode#查找重复的电子邮箱#从不订购的客户#颠倒二进制数#位1的个数

题目描述&#xff1a; 编写一个 SQL 查询&#xff0c;查找 Person 表中所有重复的电子邮箱。 分析&#xff1a; 所有电子邮箱都是小写字母 重复的电子邮箱存在多次。要计算每封电子邮件的存在次数&#xff0c;我们可以使用以下代码 代码&#xff1a; select Email from (s…

操作系统内存分配(隔离,分段和分页)

内存分配问题 进程的总体目标是希望每个进程从逻辑上来看都可以独占计算机的资源。操作系统的多任务功能使得CPU能够在多个进程之间很好地共享&#xff0c;从进程的角度看好像是它独占了CPU而不用考虑与其他进程分享CPU的事情。操作系统的I/O抽象模型也很好地实现了IO设备的共…

【增长的本质】-

关于作者 塞萨尔伊达尔戈&#xff0c;出生在智利&#xff0c;现在是美国麻省理工学院媒体实验室宏观联系研究团队的主管。他是一位著名的跨界物理学家&#xff0c;最擅长的就是利用物理概念来分析和解释经济、文化领域的大问题。他还长期致力于研究促进经济增长和繁荣的因素&a…

2022最新xcode打包IPA(完整详细图文)​

本文详细讲述iOS的App开发后如何进行证书的创建和项目中如何配置证书及上传到苹果App管理后台后如何新增与更新版本。​ 前期准备:​ ① Mac OS电脑​ ② 一款开发完毕的App​ ③ 99美元的开发者证书一个(此证书提供App上传到App Store),苹果的另外一个299美元一年的证书打…

F28069的cpu定时器

工程搭建参考&#xff1a;https://blog.csdn.net/feisy/article/details/126380289 F28069有三个32位的CPU定时器&#xff1a;0,1,2。0&#xff0c;1可用&#xff0c;如果程序未使用DIS/BIOS&#xff0c;定时器2也可用。 CPU定时器相关的有5个信号&#xff0c;四个输入信号&…

jenkins调用metersphere自动化接口

metersphere自动化测试场景&#xff0c;可以用过jenkins job配至界面化传参数&#xff0c;传递给metersphere动态执行脚本。 1.下载metersphere jenkins插件 Releases metersphere/jenkins-plugin GitHub 2.jenkins安装metersphere插件 Jenkins 的插件管理页面&#xff0c…

谷歌翻译不能用了

最近发现谷歌翻译不能使用了&#xff0c;对于英语不好的我是个问题呀。 解决办法&#xff1a; 网上说要执行 win r 然后 进行ipConfig 结果我试了&#xff0c;没有一点用。 来先试试这个吧&#xff0c;直接就成功了。 看 图 找到 C:\Windows\System32\drivers\etc\hosts文件 …

【爬虫】力扣每日一题每天自动邮件提醒!!!

使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫&#xff0c;小但实用&#xff01;&#xff01;&#xff01; 文章目录A.需求来源与分析B.技术角度分析C.具体分析步骤1.接口协议分析2.发邮件3.写crontab放服务器上定时跑D.成品1.源代码2.效果3.使用说明免责申明A.需…

面试官:你先回去等通知吧!这个 Java 岗位我还有机会吗?

面试官&#xff1a;看你简历写的不错&#xff0c;先简单自我介绍下&#xff1f; 我&#xff1a;大佬好&#xff01;我是小程&#xff0c;工作时长两年半&#xff0c;目前负责在公司打杂&#xff0c;啊不&#xff0c;负责维护公司的两个项目… 面试官&#xff1a;hmmm&#xf…