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)
{
// Potential race condition here.
// .net offers the facility to either move a file, or to replace it.
File.Delete(dest);
File.Move(src, dest);
}
///
/// 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 == 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();
}
}
}