【发布时间】:2009-05-26 10:05:10
【问题描述】:
如何在 c# 中找到已安装软件的执行路径,例如媒体播放器、vlc 播放器。我只需要找到他们的执行路径。如果我的 D 盘中安装了 vlc 播放器。如何从我的 c# 编码中找到 VLC.exe 的路径
【问题讨论】:
-
您的意思是要查看注册表吗?
如何在 c# 中找到已安装软件的执行路径,例如媒体播放器、vlc 播放器。我只需要找到他们的执行路径。如果我的 D 盘中安装了 vlc 播放器。如何从我的 c# 编码中找到 VLC.exe 的路径
【问题讨论】:
使用 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 键。
【讨论】:
此方法适用于位于 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 的方法一样,它只查找某些可执行文件的路径
【讨论】:
Path.Combine(string, string) 来简化foreach 的内部,而不是进行两个单独的测试。
我使用了 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";
}
【讨论】:
没有一个答案对我有用。经过几个小时的在线搜索,我能够成功获得安装路径。这是最终代码。
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");
和繁荣。干杯
【讨论】:
【讨论】:
This stackoverflow.com article 描述了如何获取与特定文件扩展名关联的应用程序。
也许您可以使用这种技术来获取与某些扩展相关联的应用程序,例如 avi 或 wmv——Medial Player 或 VLC 播放器?
【讨论】: