Example #1
0
        public static char GetFreeDriveLetter(bool getLastAvailable)
        {
            IEnumerable <char> freeDriveLetters = "CDEFGHIJKLMNOPQRSTUVWXYZ".Except(Directory.EnumerateLogicalDrivesInternal(false, false).Select(d => d.Name[0]));

            try
            {
                return(getLastAvailable ? freeDriveLetters.Last() : freeDriveLetters.First());
            }
            catch
            {
                throw new Exception("There are no drive letters available.");
            }
        }
Example #2
0
        private static string DosDeviceToDosPath(string dosDevice, string deviceReplacement)
        {
            if (Utils.IsNullOrWhiteSpace(dosDevice))
            {
                return(string.Empty);
            }

            foreach (string drive in Directory.EnumerateLogicalDrivesInternal(false, false).Select(drv => drv.Name))
            {
                try
                {
                    string path = RemoveTrailingDirectorySeparator(drive, false);
                    foreach (string devNt in Volume.QueryDosDevice(path).Where(dosDevice.StartsWith))
                    {
                        return(dosDevice.Replace(devNt, deviceReplacement ?? path));
                    }
                }
                catch
                {
                }
            }
            return(string.Empty);
        }
        internal static string GetFinalPathNameByHandleInternal(SafeFileHandle handle, FinalPathFormats finalPath)
        {
            NativeMethods.IsValidHandle(handle);

            var buffer = new StringBuilder(NativeMethods.MaxPathUnicode);


            // ChangeErrorMode is for the Win32 SetThreadErrorMode() method, used to suppress possible pop-ups.
            using (new NativeMethods.ChangeErrorMode(NativeMethods.ErrorMode.FailCriticalErrors))
            {
                if (NativeMethods.IsAtLeastWindowsVista)
                {
                    if (NativeMethods.GetFinalPathNameByHandle(handle, buffer, (uint)buffer.Capacity, finalPath) == Win32Errors.ERROR_SUCCESS)
                    {
                        NativeError.ThrowException(Marshal.GetLastWin32Error());
                    }

                    return(buffer.ToString());
                }
            }

            #region Older OperatingSystem

            // Obtaining a File Name From a File Handle
            // http://msdn.microsoft.com/en-us/library/aa366789%28VS.85%29.aspx

            // Be careful when using GetFileSizeEx to check the size of hFile handle of an unknown "File" type object.
            // This is more towards returning a filename from a file handle. If the handle is a named pipe handle it seems to hang the thread.
            // Check for: FileTypes.DiskFile

            // Can't map a 0 byte file.
            long fileSizeHi;
            if (!NativeMethods.GetFileSizeEx(handle, out fileSizeHi))
            {
                if (fileSizeHi == 0)
                {
                    return(string.Empty);
                }
            }


            // PAGE_READONLY
            // Allows views to be mapped for read-only or copy-on-write access. An attempt to write to a specific region results in an access violation.
            // The file handle that the hFile parameter specifies must be created with the GENERIC_READ access right.
            // PageReadOnly = 0x02,
            using (SafeFileHandle handle2 = NativeMethods.CreateFileMapping(handle, null, 2, 0, 1, null))
            {
                NativeMethods.IsValidHandle(handle, Marshal.GetLastWin32Error());

                // FILE_MAP_READ
                // Read = 4
                using (SafeLocalMemoryBufferHandle pMem = NativeMethods.MapViewOfFile(handle2, 4, 0, 0, (UIntPtr)1))
                {
                    if (NativeMethods.IsValidHandle(pMem, Marshal.GetLastWin32Error()))
                    {
                        if (NativeMethods.GetMappedFileName(Process.GetCurrentProcess().Handle, pMem, buffer, (uint)buffer.Capacity))
                        {
                            NativeMethods.UnmapViewOfFile(pMem);
                        }
                    }
                }
            }


            // Default output from GetMappedFileName(): "\Device\HarddiskVolumeX\path\filename.ext"
            string dosDevice = buffer.Length > 0 ? buffer.ToString() : string.Empty;

            // Select output format.
            switch (finalPath)
            {
            // As-is: "\Device\HarddiskVolumeX\path\filename.ext"
            case FinalPathFormats.VolumeNameNT:
                return(dosDevice);

            // To: "\path\filename.ext"
            case FinalPathFormats.VolumeNameNone:
                return(DosDeviceToDosPath(dosDevice, string.Empty));

            // To: "\\?\Volume{GUID}\path\filename.ext"
            case FinalPathFormats.VolumeNameGuid:
                string dosPath = DosDeviceToDosPath(dosDevice, null);
                if (!Utils.IsNullOrWhiteSpace(dosPath))
                {
                    string path        = GetSuffixedDirectoryNameWithoutRootInternal(null, dosPath);
                    string driveLetter = RemoveTrailingDirectorySeparator(GetPathRoot(dosPath, false), false);
                    string file        = GetFileName(dosPath, true);

                    if (!Utils.IsNullOrWhiteSpace(file))
                    {
                        foreach (string drive in Directory.EnumerateLogicalDrivesInternal(false, false).Select(drv => drv.Name).Where(drv => driveLetter.Equals(RemoveTrailingDirectorySeparator(drv, false), StringComparison.OrdinalIgnoreCase)))
                        {
                            return(CombineInternal(false, Volume.GetUniqueVolumeNameForPath(drive), path, file));
                        }
                    }
                }

                break;
            }

            // To: "\\?\C:\path\filename.ext"
            return(Utils.IsNullOrWhiteSpace(dosDevice)
            ? string.Empty
            : LongPathPrefix + DosDeviceToDosPath(dosDevice, null));

            #endregion // Older OperatingSystem
        }
Example #4
0
 public static IEnumerable <DriveInfo> EnumerateDrives(bool fromEnvironment, bool isReady)
 {
     return(Directory.EnumerateLogicalDrivesInternal(fromEnvironment, isReady));
 }
Example #5
0
 public static DriveInfo[] GetDrives()
 {
     return(Directory.EnumerateLogicalDrivesInternal(false, false).ToArray());
 }