BizHawk/Build/BizHawk.Build.Tool/ToolPathUtil.cs

94 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Win32;
//This is stolen from MSBuild Community Tasks
static class ToolPathUtil
{
public static bool SafeFileExists(string path, string toolName)
{
return SafeFileExists(Path.Combine(path, toolName));
}
public static bool SafeFileExists(string file)
{
try { return File.Exists(file); }
catch { } // eat exception
return false;
}
public static string MakeToolName(string name)
{
return (Environment.OSVersion.Platform == PlatformID.Unix) ?
name : name + ".exe";
}
public static string FindInRegistry(string toolName)
{
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + toolName, false);
if (key != null)
{
string possiblePath = key.GetValue(null) as string;
if (SafeFileExists(possiblePath))
return Path.GetDirectoryName(possiblePath);
}
}
catch (System.Security.SecurityException) { }
return null;
}
public static string FindInPath(string toolName)
{
string pathEnvironmentVariable = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
string[] paths = pathEnvironmentVariable.Split(new[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
foreach (string path in paths)
{
if (SafeFileExists(path, toolName))
{
return path;
}
}
return null;
}
public static string FindInProgramFiles(string toolName, params string[] commonLocations)
{
var trials = new[] { Environment.GetEnvironmentVariable("ProgramFiles(x86)"), Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) };
foreach (var t in trials)
{
if (t == null) continue;
foreach (string location in commonLocations)
{
string path = Path.Combine(t, location);
if (SafeFileExists(path, toolName))
{
return path;
}
}
}
return null;
}
public static string FindInLocalPath(string toolName, string localPath)
{
if (localPath == null)
return null;
string path = new DirectoryInfo(localPath).FullName;
if (SafeFileExists(localPath, toolName))
{
return path;
}
return null;
}
}