C#首先检查文件是否存在(如果不存在),使用查找更改路径

时间:2018-12-17 10:46:14

标签: c#

我正在尝试创建快速启动器应用程序并运行例如我使用的应用程序

 Process.Start("chrome.exe");

但是,我希望应用程序检查该应用程序(chrome)是否存在,如果找不到,那么它将提示用户是否要更改查找chrome的路径以及是否按是文件资源管理器将显示,他们可以选择文件所在的位置。基本上,我正在尝试使其成为动态路径,而不是固定路径。有什么建议吗?

编辑:这个问题和链接的区别是,我更多地是在寻找如何使路径动态化,而不仅仅是文件的存在,如果找不到该文件,则将显示一个搜索窗口。让用户知道文件所在的位置,并因此更改代码中的路径。

2 个答案:

答案 0 :(得分:2)

因此,如果您想知道Windows中是否安装了应用程序,可以在SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下的注册表中迭代“可卸载的应用程序”

但是没有“安装”某些仅具有可执行文件的应用程序。

void Main()
{
    if (GetInstalledApplications().Any(a => a == "Google Chrome"))
    {
        //Chrome is installed
    }
}

public IEnumerable<string> GetInstalledApplications()
{
    string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    using (var key = Registry.LocalMachine.OpenSubKey(registry_key))
    {
        foreach (var subkey_name in key.GetSubKeyNames())
        {
            using (var subkey = key.OpenSubKey(subkey_name))
            {
                yield return (string)subkey.GetValue("DisplayName");
            }
        }
    }
}

如果要通过默认可执行文件名获取已安装的应用程序(并能够启动它),则可以迭代SOFTWARE\Microsoft\Windows\CurrentVersion\App paths

中的值
void Main()
{
    var appPath = GetInstalledApplications()
                     .Where(p => p != null && p.EndsWith("Chrome.exe", StringComparison.OrdinalIgnoreCase))
                     .FirstOrDefault();
    if(appPath != null)
    {
        //Launch
    }
}

public IEnumerable<string> GetInstalledApplications()
{
    string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App paths";
    using (var key = Registry.LocalMachine.OpenSubKey(registry_key))
    {
        foreach (var subkey_name in key.GetSubKeyNames())
        {
            using (var subkey = key.OpenSubKey(subkey_name))
            {
                yield return (string)subkey.GetValue("");
            }
        }
    }
}

使用此解决方案,您可以使用搜索下拉列表并返回GetInstalledApplications的结果,以帮助用户选择正确的程序,而不必依靠他们知道正确的文件名。

答案 1 :(得分:0)

以下代码有效。请检查相同。我创建了一个示例Windows应用程序,并对其进行了测试。它正在工作。

        Process process = new Process();
        try
        {
            // Configure the process using the StartInfo properties.
            process.StartInfo.FileName = "chrome1.exe";
            process.StartInfo.Arguments = "-n";
            process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
            process.Start();
            process.WaitForExit();// Waits here for the process to exit.
        }
        catch (Win32Exception ex)
        {
            if (ex.Message.Equals("The system cannot find the file specified"))
            {
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    process.StartInfo.FileName = openFileDialog1.FileName;
                    process.Start();
                }
            }
        }