// 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); } } } }