using System; using System.IO; using System.Reflection; using System.Runtime.InteropServices; namespace mklinker { /// /// A msbuild friendly application that creates hard link between files. /// class Program { [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes); static int Main(string[] args) { if (args.Length % 2 != 0) { Console.WriteLine("Invalid arguments, please specify [target name] and [source file name] for each hard link to create."); return -2; } for (int i = 0; i < args.Length; i += 2) { var toCreate = args[i]; var existing = args[i + 1]; try { if (!File.Exists(existing)) { Console.WriteLine("error: File {0} does not exist", toCreate); return -3; } if (!File.Exists(toCreate)) { if (!Directory.Exists(Path.GetDirectoryName(toCreate))) { Directory.CreateDirectory(Path.GetDirectoryName(toCreate)); } if (!CreateHardLink(toCreate, existing, new IntPtr())) { Console.WriteLine("error: Could not create hard link {0} from {1}", toCreate, existing); return -4; } } } catch (Exception ex) { Console.WriteLine("error: Unhandled exception creating hard link {0} from {1}. Details {2}", toCreate, existing, ex.Message); return -5; } } return 0; } } }