public void FinalPathNameBasic() { using (var cleaner = new TestFileCleaner()) { string filePath = cleaner.CreateTestFile("FinalPathNameBehavior"); using (var handle = FileMethods.CreateFile(filePath.ToLower(), CreationDisposition.OpenExisting, DesiredAccess.GenericRead)) { handle.IsInvalid.Should().BeFalse(); string extendedPath = @"\\?\" + filePath; FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_NORMALIZED) .Should().Be(extendedPath); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_OPENED) .Should().Be(extendedPath); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_DOS) .Should().Be(extendedPath); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_GUID) .Should().StartWith(@"\\?\Volume"); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_NT) .Should().StartWith(@"\Device\"); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_NONE) .Should().Be(filePath.Substring(2)); } } }
public void FinalPathNameLongPath() { using (var cleaner = new TestFileCleaner()) { string longPath = @"\\?\" + PathGenerator.CreatePathOfLength(cleaner.TempFolder, 500); string filePath = Paths.Combine(longPath, System.IO.Path.GetRandomFileName()); FileHelper.CreateDirectoryRecursive(longPath); FileHelper.WriteAllText(filePath, "FinalPathNameLongPathPrefixRoundTripBehavior"); using (var handle = FileMethods.CreateFile(filePath, CreationDisposition.OpenExisting, DesiredAccess.GenericRead)) { handle.IsInvalid.Should().BeFalse(); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_NORMALIZED) .Should().Be(filePath); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_OPENED) .Should().Be(filePath); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_DOS) .Should().Be(filePath); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_GUID) .Should().StartWith(@"\\?\Volume"); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_NT) .Should().StartWith(@"\Device\"); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.VOLUME_NAME_NONE) .Should().Be(filePath.Substring(6)); } } }
public void FinalPathNameForLinks() { if (!CanCreateSymbolicLinks()) { return; } // GetFinalPathName always points to the linked file unless you specifically open the reparse point using (var cleaner = new TestFileCleaner()) { string filePath = Paths.Combine(cleaner.TempFolder, "Target"); string extendedPath = @"\\?\" + filePath; FileHelper.WriteAllText(filePath, "CreateSymbolicLinkToFile"); string symbolicLink = Paths.Combine(cleaner.TempFolder, "Link"); string extendedLink = @"\\?\" + symbolicLink; FileMethods.CreateSymbolicLink(symbolicLink, filePath); FileMethods.FileExists(symbolicLink).Should().BeTrue("symbolic link should exist"); // GetFinalPathName should normalize the casing, pushing ToUpper to validate using (var handle = FileMethods.CreateFile(symbolicLink.ToUpperInvariant(), CreationDisposition.OpenExisting, DesiredAccess.GenericRead)) { handle.IsInvalid.Should().BeFalse(); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_NORMALIZED) .Should().Be(extendedPath); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_OPENED) .Should().Be(extendedPath); } using (var handle = FileMethods.CreateFile(symbolicLink.ToUpperInvariant(), CreationDisposition.OpenExisting, DesiredAccess.GenericRead, ShareModes.ReadWrite, FileAttributes.None, FileFlags.OpenReparsePoint)) { handle.IsInvalid.Should().BeFalse(); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_NORMALIZED) .Should().Be(extendedLink); FileMethods.GetFinalPathNameByHandle(handle, GetFinalPathNameByHandleFlags.FILE_NAME_OPENED) .Should().Be(extendedLink); } } }