public void GetChainOfJunctions() { string targetDirectory = GetFullPath("target"); Directory.CreateDirectory(targetDirectory); string intermediateJunction = GetFullPath("intermediate.jct"); Directory.CreateDirectory(intermediateJunction); FileUtilities.CreateJunction(intermediateJunction, targetDirectory); string sourceJunction = GetFullPath("source.jct"); Directory.CreateDirectory(sourceJunction); FileUtilities.CreateJunction(sourceJunction, intermediateJunction); using (SafeFileHandle handle = OpenHandleForReparsePoint(sourceJunction)) { var chain = new List <string>(); FileUtilities.GetChainOfReparsePoints(handle, sourceJunction, chain); XAssert.AreEqual(3, chain.Count, "Chain of reparse points: " + string.Join(" -> ", chain)); XAssert.AreEqual(sourceJunction.ToUpperInvariant(), TrimPathPrefix(chain[0].ToUpperInvariant())); XAssert.AreEqual(intermediateJunction.ToUpperInvariant(), TrimPathPrefix(chain[1].ToUpperInvariant())); XAssert.AreEqual(targetDirectory.ToUpperInvariant(), TrimPathPrefix(chain[2].ToUpperInvariant())); } }
public void TestResolveSymlinkWithDirectorySymlinkOrJunction(bool useJunction, bool oneDotDot) { // File and directory layout: // Enlist // | // +---Intermediate // | \---Current // | file.lnk ==> ..\..\Target\file.txt (or ..\Target\file.txt) // | // +---Source ==> Intermediate\Current // | // \---Target // file.txt // Create a symlink Enlist/Intermediate/Current/file.lnk --> ../../Target/file.txt (or ../Target/file.txt) string symlinkFile = GetFullPath(R("Enlist", "Intermediate", "Current", "file.lnk")); FileUtilities.CreateDirectory(GetFullPath(R("Enlist", "Intermediate", "Current"))); var relativeTarget = oneDotDot ? R("..", "Target", "file.txt") : R("..", "..", "Target", "file.txt"); XAssert.PossiblySucceeded(FileUtilities.TryCreateSymbolicLink(symlinkFile, relativeTarget, isTargetFile: true)); // Create a directory symlink Enlist/Source --> Enlist/Intermediate/Current string symlinkDirectory = GetFullPath(R("Enlist", "Source")); if (useJunction) { FileUtilities.CreateDirectory(symlinkDirectory); FileUtilities.CreateJunction(symlinkDirectory, GetFullPath(R("Enlist", "Intermediate", "Current"))); } else { XAssert.PossiblySucceeded(FileUtilities.TryCreateSymbolicLink(symlinkDirectory, R("Intermediate", "Current"), isTargetFile: false)); } string expectedFinalPath = null; if (useJunction) { expectedFinalPath = oneDotDot ? GetFullPath(R("Enlist", "Target", "file.txt")) : GetFullPath(R("Target", "file.txt")); } else { expectedFinalPath = oneDotDot ? GetFullPath(R("Enlist", "Intermediate", "Target", "file.txt")) : GetFullPath(R("Enlist", "Target", "file.txt")); } // Resolve symlink Enlist/Source/file.lnk by supplying the symlink relative target path (../../Target/file.txt or ../Target/file.txt). var maybeResult = FileUtilities.ResolveSymlinkTarget(GetFullPath(R("Enlist", "Source", "file.lnk")), relativeTarget); XAssert.PossiblySucceeded(maybeResult); XAssert.ArePathEqual(expectedFinalPath, maybeResult.Result); // Resolve symlink Enlist/Source/file.lnk without supplying the symlink target path // The result should be Enlist/Target/file.txt maybeResult = FileUtilities.ResolveSymlinkTarget(GetFullPath(R("Enlist", "Source", "file.lnk"))); XAssert.PossiblySucceeded(maybeResult); XAssert.ArePathEqual(expectedFinalPath, maybeResult.Result); }