예제 #1
0
파일: PathTest.cs 프로젝트: jdstroy/AlphaFS
        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);
        }