所有物理驱动器的列表

时间:2016-03-23 10:20:29

标签: c# win-universal-app uwp

如何获取UWP(Windows 10)应用程序中所有物理驱动器的列表?我尝试使用Windows.Storage.KnownFolders,但这样我只能从库中获取文件夹。

2 个答案:

答案 0 :(得分:3)

UWP 中,您无法列出所有文件/驱动器(使用官方API) - 这可能是出于安全考虑。 Windows应用商店应用工作是隔离的,只有有限的资源/位置才能访问。在这种情况下,您可以自由地访问虚拟位置,如 MusicLibray PicturesLibrary 等。您将找到的访问权限列表at MSDN

如果您想要从上述范围之外访问文件/文件夹,则用户必须为您的应用程序授予对其的访问权限。为此,您can use pickers

答案 1 :(得分:2)

我知道您很久以前就问过这个问题,但是我创建了一个问题(Get Internal Drives Using Windows.Storage Namespace in UWP),以提供获取内部驱动器的方法,并鼓励反馈/讨论更好的选择。

我有完全相同的问题要解决,而我在网上找到的所有其他内容都不符合我要尝试做的事情。因此,在将BroadFileSystemAccess属性添加到清单文件后,并在``隐私设置''中为该应用打开了文件系统访问权限后,可以调用StorageFolder.GetFolderFromPathAsync来获取驱动器号,如果驱动器存在,它将返回一个StorageFolder实例。 / p>

遗憾的是,没有列出驱动器的方法,因此我写了一些代码来循环遍历所有字母,然后调用GetFolderFromPathAsync来查看是否返回了驱动器句柄。

我创建的用于获取驱动器列表的方法如下:

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;
}

这是调用代码:

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);
}

尽管代码可以正常工作,但调用带有错误参数的方法并处理异常不是一个好习惯。但是由于缺乏合适的选择,我不知道还有其他选择。