using System; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; namespace Semmle.Util { public static class FileUtils { public static string ConvertToWindows(string path) { return path.Replace('/', '\\'); } public static string ConvertToUnix(string path) { return path.Replace('\\', '/'); } public static string ConvertToNative(string path) { return Path.DirectorySeparatorChar == '/' ? path.Replace('\\', '/') : path.Replace('/', '\\'); } /// /// Moves the source file to the destination, overwriting the destination file if /// it exists already. /// /// Source file. /// Target file. public static void MoveOrReplace(string src, string dest) { File.Move(src, dest, overwrite: true); } /// /// Attempt to delete the given file (ignoring I/O exceptions). /// /// The file to delete. public static void TryDelete(string file) { try { File.Delete(file); } catch (IOException) { // Ignore } } /// /// Finds the path for the program based on the /// PATH environment variable, and in the case of Windows the /// PATHEXT environment variable. /// /// Returns null of no path can be found. /// public static string? FindProgramOnPath(string prog) { var paths = Environment.GetEnvironmentVariable("PATH")?.Split(Path.PathSeparator); string[] exes; if (Win32.IsWindows()) { var extensions = Environment.GetEnvironmentVariable("PATHEXT")?.Split(';')?.ToArray(); exes = extensions is null || extensions.Any(prog.EndsWith) ? new[] { prog } : extensions.Select(ext => prog + ext).ToArray(); } else { exes = new[] { prog }; } var candidates = paths?.Where(path => exes.Any(exe0 => File.Exists(Path.Combine(path, exe0)))); return candidates?.FirstOrDefault(); } /// /// Computes the hash of . /// public static string ComputeFileHash(string filePath) { using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); using var shaAlg = new SHA256Managed(); var sha = shaAlg.ComputeHash(fileStream); var hex = new StringBuilder(sha.Length * 2); foreach (var b in sha) hex.AppendFormat("{0:x2}", b); return hex.ToString(); } } }