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."); } }
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 }
public static IEnumerable <DriveInfo> EnumerateDrives(bool fromEnvironment, bool isReady) { return(Directory.EnumerateLogicalDrivesInternal(fromEnvironment, isReady)); }
public static DriveInfo[] GetDrives() { return(Directory.EnumerateLogicalDrivesInternal(false, false).ToArray()); }