private void DumpGetFinalPathNameByHandle(bool isLocal) { Console.WriteLine("\n=== TEST {0} ===", isLocal ? UnitTestConstants.Local : UnitTestConstants.Network); var tempFile = Path.GetTempFileName(); if (!isLocal) { tempFile = Path.LocalToUnc(tempFile); } var longTempStream = Path.LongPathPrefix + tempFile; bool gotFileNameNormalized; bool gotFileNameOpened; bool gotVolumeNameDos; bool gotVolumeNameGuid; bool gotVolumeNameNt; bool gotVolumeNameNone; bool gotSomething; using (var stream = File.Create(tempFile)) { // For Windows versions < Vista, the file must be > 0 bytes. if (!NativeMethods.IsAtLeastWindowsVista) { stream.WriteByte(1); } var handle = stream.SafeFileHandle; UnitTestConstants.StopWatcher(true); var fileNameNormalized = Path.GetFinalPathNameByHandle(handle); var fileNameOpened = Path.GetFinalPathNameByHandle(handle, FinalPathFormats.FileNameOpened); var volumeNameDos = Path.GetFinalPathNameByHandle(handle, FinalPathFormats.None); var volumeNameGuid = Path.GetFinalPathNameByHandle(handle, FinalPathFormats.VolumeNameGuid); var volumeNameNt = Path.GetFinalPathNameByHandle(handle, FinalPathFormats.VolumeNameNT); var volumeNameNone = Path.GetFinalPathNameByHandle(handle, FinalPathFormats.VolumeNameNone); // These three output the same. gotFileNameNormalized = !string.IsNullOrWhiteSpace(fileNameNormalized) && longTempStream.Equals(fileNameNormalized); gotFileNameOpened = !string.IsNullOrWhiteSpace(fileNameOpened) && longTempStream.Equals(fileNameOpened); gotVolumeNameDos = !string.IsNullOrWhiteSpace(volumeNameDos) && longTempStream.Equals(volumeNameDos); gotVolumeNameGuid = !string.IsNullOrWhiteSpace(volumeNameGuid) && volumeNameGuid.StartsWith(Path.VolumePrefix) && volumeNameGuid.EndsWith(volumeNameNone); gotVolumeNameNt = !string.IsNullOrWhiteSpace(volumeNameNt) && volumeNameNt.StartsWith(Path.DevicePrefix); gotVolumeNameNone = !string.IsNullOrWhiteSpace(volumeNameNone) && tempFile.EndsWith(volumeNameNone); Console.WriteLine("\nInput Path: [{0}]", tempFile); Console.WriteLine("\n\tFilestream.Name : [{0}]", stream.Name); Console.WriteLine("\tFilestream.Length: [{0}] (Note: For Windows versions < Vista, the file must be > 0 bytes.)\n", Utils.UnitSizeToText(stream.Length)); Console.WriteLine("\tFinalPathFormats.None : [{0}]", fileNameNormalized); Console.WriteLine("\tFinalPathFormats.FileNameOpened: [{0}]", fileNameOpened); Console.WriteLine("\tFinalPathFormats.VolumeNameDos : [{0}]", volumeNameDos); Console.WriteLine("\tFinalPathFormats.VolumeNameGuid: [{0}]", volumeNameGuid); Console.WriteLine("\tFinalPathFormats.VolumeNameNT : [{0}]", volumeNameNt); Console.WriteLine("\tFinalPathFormats.VolumeNameNone: [{0}]", volumeNameNone); Console.WriteLine("\n{0}", UnitTestConstants.Reporter(true)); gotSomething = true; } var fileExists = File.Exists(tempFile); File.Delete(tempFile, true); Assert.IsFalse(File.Exists(tempFile), "Cleanup failed: File should have been removed."); Assert.IsTrue(fileExists); Assert.IsTrue(gotFileNameNormalized); Assert.IsTrue(gotFileNameOpened); Assert.IsTrue(gotVolumeNameDos); Assert.IsTrue(gotVolumeNameGuid); Assert.IsTrue(gotVolumeNameNt); Assert.IsTrue(gotVolumeNameNone); Assert.IsTrue(gotSomething); // AlphaFS implementation of fileStream.Name returns = "[Unknown]" // System.IO returns the full path. Console.WriteLine(); var fileName = Path.Combine(Environment.ExpandEnvironmentVariables("%temp%") + "foo.bar"); var fileStream2 = System.IO.File.Create(fileName); Assert.AreEqual(fileStream2.Name, fileName); fileStream2.Close(); File.Delete(fileName); var fileStream = File.Create(fileName); var fileStreamName = Alphaleonis.Win32.Filesystem.Path.GetFinalPathNameByHandle(fileStream.SafeFileHandle); Assert.AreNotEqual(fileName, fileStream.Name); Assert.AreEqual(fileName, Path.GetRegularPath(fileStreamName)); fileStream.Close(); File.Delete(fileName); }