public void GetFullPathWithBasePathTests(string path, string basePath, string expected) { IExtendedFileService extendedFileService = Substitute.For<IExtendedFileService>(); extendedFileService.GetVolumeName(@"C:\").Returns("TestCVolumeName"); extendedFileService.GetVolumeName(@"D:\").Returns("TestDVolumeName"); var fileService = new FileService(extendedFileService, initialCurrentDirectory: @"C:\Users"); fileService.GetFullPath(path, basePath).Should().Be(expected); }
public void CreateSymbolicLinkToLongPathFile() { using (var cleaner = new TestFileCleaner()) { string filePath = Paths.Combine(cleaner.TempFolder, Path.GetRandomFileName()); IExtendedFileService fileService = new FileService(); fileService.WriteAllText(filePath, "CreateSymbolicLinkToFile"); string symbolicLink = Paths.Combine(cleaner.TempFolder, Path.GetRandomFileName()); Action action = () => NativeMethods.FileManagement.CreateSymbolicLink(symbolicLink, filePath); if (fileService.CanCreateSymbolicLinks()) { action(); var attributes = NativeMethods.FileManagement.GetFileAttributes(symbolicLink); attributes.Should().HaveFlag(FileAttributes.ReparsePoint); } else { action.ShouldThrow<IOException>().And.HResult.Should().Be(NativeErrorHelper.GetHResultForWindowsError(NativeMethods.WinError.ERROR_PRIVILEGE_NOT_HELD)); } } }
public void FinalPathNameLinkBehavior() { IExtendedFileService fileService = new FileService(); if (!fileService.CanCreateSymbolicLinks()) return; // GetFinalPathName always points to the linked file using (var cleaner = new TestFileCleaner()) { string filePath = Paths.Combine(cleaner.TempFolder, Path.GetRandomFileName()); fileService.WriteAllText(filePath, "CreateSymbolicLinkToFile"); string symbolicLink = Paths.Combine(cleaner.TempFolder, Path.GetRandomFileName()); NativeMethods.FileManagement.CreateSymbolicLink(symbolicLink, filePath); NativeMethods.FileManagement.FileExists(symbolicLink).Should().BeTrue("symbolic link should exist"); using (var handle = NativeMethods.FileManagement.CreateFile(symbolicLink, FileAccess.Read, FileShare.ReadWrite, FileMode.Open, 0)) { handle.IsInvalid.Should().BeFalse(); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.FILE_NAME_NORMALIZED) .Should().Be(filePath); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.FILE_NAME_OPENED) .Should().Be(filePath); } } }
public void FinalPathNameBehavior() { using (var cleaner = new TestFileCleaner()) { string filePath = Paths.Combine(cleaner.TempFolder, Path.GetRandomFileName()); IFileService system = new FileService(); system.WriteAllText(filePath, "FinalPathNameBehavior"); using (var handle = NativeMethods.FileManagement.CreateFile(filePath.ToLower(), FileAccess.Read, FileShare.ReadWrite, FileMode.Open, 0)) { handle.IsInvalid.Should().BeFalse(); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.FILE_NAME_NORMALIZED) .Should().Be(filePath); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.FILE_NAME_OPENED) .Should().Be(filePath); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_DOS) .Should().Be(filePath); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_GUID) .Should().StartWith(@"Volume"); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_NT) .Should().StartWith(@"\Device\"); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_NONE) .Should().Be(filePath.Substring(2)); } } }
public void FinalPathNameLongPathPrefixRoundTripBehavior() { using (var cleaner = new TestFileCleaner(false)) { string longPath = PathGenerator.CreatePathOfLength(cleaner.TempFolder, 500); string filePath = Paths.Combine(longPath, Path.GetRandomFileName()); IFileService system = new FileService(); system.CreateDirectory(longPath); system.WriteAllText(filePath, "FinalPathNameLongPathPrefixRoundTripBehavior"); // The wrapper for create file will add \\?\, we shouldn't get it back using (var handle = NativeMethods.FileManagement.CreateFile(filePath, FileAccess.Read, FileShare.ReadWrite, FileMode.Open, 0)) { handle.IsInvalid.Should().BeFalse(); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.FILE_NAME_NORMALIZED) .Should().Be(filePath); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.FILE_NAME_OPENED) .Should().Be(filePath); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_DOS) .Should().Be(filePath); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_GUID) .Should().StartWith(@"Volume"); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_NT) .Should().StartWith(@"\Device\"); NativeMethods.FileManagement.GetFinalPathName(handle, NativeMethods.FileManagement.FinalPathFlags.VOLUME_NAME_NONE) .Should().Be(filePath.Substring(2)); } } }
public void LongPathFileExistsTests() { using (var cleaner = new TestFileCleaner(false)) { string longPath = PathGenerator.CreatePathOfLength(cleaner.TempFolder, 500); string filePath = Paths.Combine(longPath, Path.GetRandomFileName()); IFileService system = new FileService(); system.CreateDirectory(longPath); system.WriteAllText(filePath, "FileExists"); NativeMethods.FileManagement.FileExists(filePath).Should().BeTrue(); NativeMethods.FileManagement.PathExists(filePath).Should().BeTrue(); NativeMethods.FileManagement.DirectoryExists(filePath).Should().BeFalse(); } }