如何以编程方式获取其他应用程序的安装路径?

时间:2010-10-12 16:06:21

标签: c# windows path installation

我想知道应用程序的安装路径在哪里。我知道它通常在... \ Program Files ...但我想有些人会把它安装在不同的位置。我知道应用程序的名称。

谢谢。

6 个答案:

答案 0 :(得分:12)

查找程序安装路径(在Windows上)的理想方法是从注册表中读取它。大多数安装程序将为包含安装路径的程序创建一个注册表项。这个密钥的确切位置以及它的名称取决于所讨论的程序。

要查找该程序是否在注册表中有密钥,请打开“regedit”并使用编辑>查找选项以尝试使用程序名称查找密钥。如果存在此类密钥,则可以使用.NET Framework库中的RegistryKey类来读取它。

如果程序没有注册表项,那么另一个选项就是要求用户使用OpenFileDialog找到.exe文件,尽管这显然不太理想。

答案 1 :(得分:10)

许多(大多数?)程序会创建一个App Paths注册表项。看看

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

答案 2 :(得分:4)

如果您知道相关应用程序(与任何应用程序相比),则注册表项可能是最佳选项(如果存在)。

安装可能会在某处放置自己的自定义“安装路径密钥”(如Fara所提到的那样),或者它可能位于已安装程序的卸载部分中,因此您可以检查:

  • HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载

但请注意,任何新版本的安装都可能会更改它写出的密钥,包括自定义密钥或卸载条目。因此,检查注册表应该只适用于已知的install \ version。

TEP

答案 3 :(得分:3)

最好的方法是使用Installer API查找程序位置。 您可以通过API编写托管包装器

搜索MsiGetProductInfo

参考:http://msdn.microsoft.com/en-us/library/aa369558(VS.85).aspx

答案 4 :(得分:0)

你可以使用MSI(我在这里写了一个C#包装器https://github.com/alialavia/MSINet)。这是一个简单的例子:

var location = "";
foreach (var p in InstalledProduct.Enumerate())
{
    try
    {
        if (p.InstalledProductName.Contains("AppName"))                     
        {
            location = p.InstallLocation;
            break;
        }
    } 
    catch { }
}

答案 5 :(得分:0)

在注册表中查看。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\

上面的每一个都包含一个子项列表,每个安装的应用程序都有一个子项(例如,在“程序和功能”小程序中显示)

您可以在此处搜索您的应用程序,或者如果您知道产品代码,则直接访问它。

    public string GetInstallPath(string applicationName)
    {
        var installPath = FindApplicationPath(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", applicationName);

        if (installPath == null)
        {
            installPath = FindApplicationPath(@"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall", applicationName);
        }

        return installPath;
    }

    private string FindApplicationPath(string keyPath, string applicationName)
    {

        var hklm = Registry.LocalMachine;
        var uninstall = hklm.OpenSubKey(keyPath);
        foreach (var productSubKey in uninstall.GetSubKeyNames())
        {
            var product = uninstall.OpenSubKey(productSubKey);

            var displayName = product.GetValue("DisplayName");
            if (displayName != null && displayName.ToString() == applicationName)
            {
                return product.GetValue("InstallLocation").ToString();
            }

        }

        return null;
    }