Потратив некоторое время на чтение классов и методов Windows.Storage, я немного шокирован, обнаружив, что не существует простого способа получить список внутренних дисков на машине с помощью UWP. Я нашел такие примеры: Как получить имена логических дисков в Windows 10? , но это касается только съемных носителей (флэш-накопителей, DVD-дисков и т. Д.).
Iзнаю, что я могу позволить пользователю выбрать папку, и это даст мне ручку для выбранного диска, но это кажется неуклюжим, поскольку я хочу, чтобы пользователь мог запускать мое программное обеспечение и сканировать внутренние диски на ПК без необходимостидля повторного выбора дисков каждый раз.
Я добавил атрибут broadFileSystemAccess в манифест, поэтому имею доступ к дискам, я просто не могу вызвать метод для получения внутренних дисков. В качестве обходного пути я написал следующий метод:
public List<StorageFolder> GetInternalDrives()
{
string driveLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int driveLettersLen = driveLetters.Length;
string removableDriveLetters = "";
string driveLetter;
List<StorageFolder> drives = new List<StorageFolder>();
StorageFolder removableDevices = KnownFolders.RemovableDevices;
IReadOnlyList<StorageFolder> folders = Task.Run<IReadOnlyList<StorageFolder>>(async () => await removableDevices.GetFoldersAsync()).Result;
foreach (StorageFolder removableDevice in folders)
{
if (string.IsNullOrEmpty(removableDevice.Path)) continue;
driveLetter = removableDevice.Path.Substring(0, 1).ToUpper();
if (driveLetters.IndexOf(driveLetter) > -1) removableDriveLetters += driveLetter;
}
for (int curDrive = 0; curDrive < driveLettersLen; curDrive++)
{
driveLetter = driveLetters.Substring(curDrive, 1);
if (removableDriveLetters.IndexOf(driveLetter) > -1) continue;
try
{
StorageFolder drive = Task.Run<StorageFolder>(async () => await StorageFolder.GetFolderFromPathAsync(driveLetter + ":")).Result;
drives.Add(drive);
}
catch (System.AggregateException) { }
}
return drives;
}
И вот пример вызова GetInternalDrives:
List<StorageFolder> drives = GetInternalDrives();
panScanParams.Children.Clear();
foreach (StorageFolder drive in drives)
{
CheckBox cb = new CheckBox();
cb.Content = drive.DisplayName;
cb.IsChecked = true;
panScanParams.Children.Add(cb);
}
Хотя код вызывается только один раз для экземпляраприложение, я совсем не доволен кодом. Так как он вызывает StorageFolder.GetFolderFromPathAsync для каждой буквы алфавита, на моей машине происходит сбой более 20 раз. Написание кода, который вы ожидаете потерпеть неудачу, и обработка исключения, кажется плохой практикой. Но из-за отсутствия подходящей альтернативы я не знаю, какие у меня есть другие варианты.
Кто-нибудь сталкивался с такой же проблемой, и если да, то что вы сделали для ее решения?