【问题标题】:how to find the execution path of a installed software如何找到已安装软件的执行路径
【发布时间】:2009-05-26 10:05:10
【问题描述】:

如何在 c# 中找到已安装软件的执行路径,例如媒体播放器、vlc 播放器。我只需要找到他们的执行路径。如果我的 D 盘中安装了 vlc 播放器。如何从我的 c# 编码中找到 VLC.exe 的路径

【问题讨论】:

  • 您的意思是要查看注册表吗?

标签: c# windows


【解决方案1】:

使用 C# 代码,您可以通过这种方式找到一些可执行文件的路径:

private const string keyBase = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths";
private string GetPathForExe(string fileName)
{
    RegistryKey localMachine = Registry.LocalMachine;
    RegistryKey fileKey = localMachine.OpenSubKey(string.Format(@"{0}\{1}", keyBase, fileName));
    object result = null;
    if (fileKey != null)
    {
        result = fileKey.GetValue(string.Empty);
        fileKey.Close();
    }


    return (string)result;
}

像这样使用它:

string pathToExe = GetPathForExe("wmplayer.exe");

但是,您想要的应用程序很可能没有 App Paths 键。

【讨论】:

  • 谢谢,这正是我需要的。
【解决方案2】:

此方法适用于位于 Windows PATH 变量中定义的文件夹中的任何可执行文件:

private string LocateEXE(String filename)
{
    String path = Environment.GetEnvironmentVariable("path");
    String[] folders = path.Split(';');
    foreach (String folder in folders)
    {
        if (File.Exists(folder + filename))
        {
            return folder + filename;
        } 
        else if (File.Exists(folder + "\\" + filename)) 
        {
            return folder + "\\" + filename;
        }
    }

    return String.Empty;
}

然后按如下方式使用:

string pathToExe = LocateEXE("example.exe");

与 Fredrik 的方法一样,它只查找某些可执行文件的路径

【讨论】:

  • 小修正,以便您的代码可以正常工作:1)您的代码的所有部分都没有返回值,2)'LocateEXE'(拼写错误)3)文件夹+“\\”+文件名。但这仅在您安装的应用程序设置路径变量时才有效。在大多数情况下,它不起作用。 else if 部分在做什么。?你能解释一下吗?
  • 1 & 2) 哎呀,现在更正了,3) 错过了一个 + "\\" + ,它旨在检查路径中的文件夹是否以反斜杠结尾
  • 是的,它确实不适用于很多情况,但这与 Fredrik 的建议相同,我们都指出它不会一直有效。在您要求最终用户配置为指向 VLC 的应用程序中使用 AppSetting 或类似内容可能会更容易
  • 您可以通过使用Path.Combine(string, string) 来简化foreach 的内部,而不是进行两个单独的测试。
【解决方案3】:

我使用了 CurrentVersion\Installer\Folders 注册表项。只需传入产品名称即可。

private string GetAppPath(string productName)
    {
        const string foldersPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders";
        var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);

        var subKey = baseKey.OpenSubKey(foldersPath);
        if (subKey == null)
        {
            baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
            subKey = baseKey.OpenSubKey(foldersPath);
        }
        return subKey != null ? subKey.GetValueNames().FirstOrDefault(kv => kv.Contains(productName)) : "ERROR";          
    }

【讨论】:

    【解决方案4】:

    没有一个答案对我有用。经过几个小时的在线搜索,我能够成功获得安装路径。这是最终代码。

    public static string checkInstalled(string findByName)
        {
            string displayName;
            string InstallPath;
            string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    
            //64 bits computer
            RegistryKey key64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
            RegistryKey key = key64.OpenSubKey(registryKey);
    
            if (key != null)
            {
                foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
                {
                    displayName = subkey.GetValue("DisplayName") as string;
                    if (displayName != null && displayName.Contains(findByName))
                    {
    
                        InstallPath = subkey.GetValue("InstallLocation").ToString();
    
                        return InstallPath; //or displayName
    
                    }
                }
                key.Close();
            }
    
            return null;
        }
    

    你可以这样调用这个方法

    string JavaPath = Software.checkInstalled("Java(TM) SE Development Kit");
    

    和繁荣。干杯

    【讨论】:

      【解决方案5】:

      【讨论】:

      • 你能详细解释一下吗?
      【解决方案6】:

      This stackoverflow.com article 描述了如何获取与特定文件扩展名关联的应用程序。

      也许您可以使用这种技术来获取与某些扩展相关联的应用程序,例如 avi 或 wmv——Medial Player 或 VLC 播放器?

      【讨论】:

        猜你喜欢
        • 2011-09-02
        • 2011-02-05
        • 2021-09-13
        • 2019-12-16
        • 1970-01-01
        • 2019-11-08
        • 2017-01-29
        • 2017-05-26
        • 2019-09-22
        相关资源
        最近更新 更多