花了一些时间阅读 Windows.Storage 类和方法后,我有点震惊地发现没有简单的方法可以使用 UWP 检索机器上的内部驱动器列表。我发现了这样的例子:如何在 Windows 10 中获取逻辑驱动器名称?,但这仅提供可移动驱动器(闪存驱动器、DVD 驱动器等)。
我知道我可以允许用户选择一个文件夹,这将为我提供所选驱动器的句柄,但这似乎很笨拙,因为我希望用户能够运行我的软件并扫描 PC 上的内部磁盘而无需每次都必须重新选择驱动器。
我已将 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 多次。编写您期望失败的代码并处理异常似乎是不好的做法。但是由于缺乏合适的选择,我不知道我还有什么其他选择。
有没有人解决过同样的问题,如果有,你做了什么来解决它?