diff --git a/FileSystem/PathCombine.cs b/FileSystem/PathCombine.cs index 722ff4e..951a214 100644 --- a/FileSystem/PathCombine.cs +++ b/FileSystem/PathCombine.cs @@ -24,9 +24,18 @@ public static string UniversalCombine(string[] paths, HashSet invalidChars } List nicePaths = new List(); + bool startsWithShare = false; + foreach (var path in paths) { - var splitPath = path.Split(new[] { WindowsSeparator, LinuxSeparator }, StringSplitOptions.RemoveEmptyEntries); + string cleanPath = path; + if(path.StartsWith(WindowsSeparator+ WindowsSeparator)) + { + cleanPath = path.TrimStart('\\'); + startsWithShare = true; + } + + var splitPath = cleanPath.Split(new[] { WindowsSeparator, LinuxSeparator }, StringSplitOptions.RemoveEmptyEntries); nicePaths.AddRange(splitPath.Where(p => !String.IsNullOrWhiteSpace(p))); } @@ -36,7 +45,7 @@ public static string UniversalCombine(string[] paths, HashSet invalidChars { separator = LinuxSeparator; } - else if (nicePaths[0].EndsWith(":")) + else if (nicePaths[0].EndsWith(":") || startsWithShare) { separator = WindowsSeparator; } @@ -47,6 +56,11 @@ public static string UniversalCombine(string[] paths, HashSet invalidChars var result = String.Join(separator, nicePaths); + if (startsWithShare) + { + result = "\\\\" + result; + } + if (separator == LinuxSeparator && paths[0].StartsWith(LinuxSeparator)) { // Linux paths need to start with a / only if we already had a /. diff --git a/FileSystemTests/PathCombineTests.cs b/FileSystemTests/PathCombineTests.cs index 14b3cd6..4cbc641 100644 --- a/FileSystemTests/PathCombineTests.cs +++ b/FileSystemTests/PathCombineTests.cs @@ -28,6 +28,7 @@ public class PathCombineTests [DataRow(new[] { "/github/", "FolderC/FolderD", "File.xml" }, "/github/FolderC/FolderD/File.xml")] [DataRow(new[] { "/github", "FolderC/FolderD" }, "/github/FolderC/FolderD")] [DataRow(new[] { "/github\\what?", "FolderC/FolderD" }, "/github/what?/FolderC/FolderD")] + [DataRow(new[] { "\\\\127.0.0.1\\c$", "skyline dataminer\\test.txt" }, "\\\\127.0.0.1\\c$\\skyline dataminer\\test.txt")] public void UniversalCombineTests(string[] paths, string expectedResult) { var result = PathCombine.UniversalCombine(paths, _invalidCharacters);