// Spludlow Software
// Copyright © Samuel P. Ludlow 2020 All Rights Reserved
// Distributed under the terms of the GNU General Public License version 3
// Distributed WITHOUT ANY WARRANTY; without implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
// https://www.spludlow.co.uk/LICENCE.TXT
// The Spludlow logo is a registered trademark of Samuel P. Ludlow and may not be used without permission
// v1.14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Spludlow.Io
{
public class FsLinks
{
public static void LinkFile(string link, string target)
{
LinkFiles(new string[][] { new string[] { link, target } }, false, null);
}
public static void LinkFiles(string[][] linkTargetFilenames)
{
LinkFiles(linkTargetFilenames, false, null);
}
///
/// target can be relative path if originDirectory supplied
/// link should always use full path
///
///
///
///
///
public static void LinkFiles(string[][] linkTargetFilenames, bool hard, string originDirectory)
{
string flag = hard ? "/H " : "";
List linkDirectories = new List();
StringBuilder batch = new StringBuilder();
for (int index = 0; index < linkTargetFilenames.Length; ++index)
{
string link = linkTargetFilenames[index][0];
string target = linkTargetFilenames[index][1];
string linkDirectory = Path.GetDirectoryName(link);
if (linkDirectories.Contains(linkDirectory) == false)
linkDirectories.Add(linkDirectory);
// Escape characters, may be more
link = link.Replace("%", "%%");
batch.Append("mklink ");
batch.Append(flag);
batch.Append('\"');
batch.Append(link);
batch.Append("\" \"");
batch.Append(target);
batch.Append('\"');
batch.AppendLine();
}
foreach (string linkDirectory in linkDirectories)
{
if (Directory.Exists(linkDirectory) == false)
Directory.CreateDirectory(linkDirectory);
}
Spludlow.SpawnProcess.ProcessExitInfo info;
using (Spludlow.TempDirectory tempDir = new TempDirectory())
{
string batchFilename = tempDir.Path + @"\link.bat";
File.WriteAllText(batchFilename, batch.ToString(), new UTF8Encoding(false));
string input = "chcp 65001" + Environment.NewLine + batchFilename + Environment.NewLine;
info = Spludlow.SpawnProcess.Run("cmd.exe", null, originDirectory, null, 0, false, input, Encoding.UTF8);
}
//foreach (string[] linkTarget in linkTargetFilenames)
//{
// if (File.Exists(linkTarget[0]) == false)
// Spludlow.Log.Error("Link Failure: " + linkTarget[0] + " -> " + linkTarget[1]);
//}
if (info.ExitCode != 0 || info.StandardError.Length > 0)
{
Spludlow.Log.Error("LinkFiles, StandardError, exit code: " + info.ExitCode, info.StandardError);
Spludlow.Log.Error("LinkFiles, StandardOutput, exit code: " + info.ExitCode, info.StandardOutput);
throw new ApplicationException("LinkFiles, exit code: " + info.ExitCode);
}
}
}
}