C# 所有物理驱动器的列表

C# 所有物理驱动器的列表,c#,win-universal-app,uwp,C#,Win Universal App,Uwp,如何在UWP(Windows 10)应用程序中获取所有物理驱动器的列表?我尝试使用Windows.Storage.KnownFolders,但这样我只能从库中获取文件夹。在UWP中,您不能像那样列出所有文件/驱动器(使用官方API)-这是出于设计,可能是出于安全原因。Windows应用商店应用程序是隔离的,访问权限仅授予有限的资源/位置。在这种情况下,您可以自由访问虚拟位置,如MusicLibrary、PicturesLibrary等。您将找到的访问权限列表 如果您想从上述范围外访问文件/文件夹

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

在UWP中,您不能像那样列出所有文件/驱动器(使用官方API)-这是出于设计,可能是出于安全原因。Windows应用商店应用程序是隔离的,访问权限仅授予有限的资源/位置。在这种情况下,您可以自由访问虚拟位置,如MusicLibrary、PicturesLibrary等。您将找到的访问权限列表


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

我知道您很久以前就提出了这个问题,但我创建了一个问题(),以提供获取内部驱动器的方法,并鼓励就更好的替代方案进行反馈/讨论

我也有同样的问题要解决,而我在网上找到的所有东西都不符合我的想法。因此,在隐私设置中将broadFileSystemAccess属性添加到清单文件并为应用程序打开文件系统访问时,可以调用StorageFolder.GetFolderFromPathAsync获取驱动器号,如果驱动器存在,它将返回StorageFolder的实例

遗憾的是,没有列出驱动器的方法,所以我写了一些东西来循环遍历字母表中的所有字母,并调用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;
}
public List getInternalDrive()
{
string driveLetters=“abcdefghijklmnopqrstuvxyz”;
int driveletteslen=driveLetters.Length;
字符串removableDriveLetters=“”;
字符串驱动字母;
列表驱动器=新列表();
StorageFolder removableDevices=KnownFolders.removableDevices;
IReadOnlyList folders=Task.Run(async()=>await removableDevices.GetFoldersAsync()).Result;
foreach(文件夹中的StorageFolder removableDevice)
{
如果(string.IsNullOrEmpty(removableDevice.Path))继续;
driveLetter=removableDevice.Path.Substring(0,1.ToUpper();
if(driveLetters.IndexOf(driveLetter)>-1)removableDriveLetters+=driveLetter;
}
对于(int curDrive=0;curDrive-1)继续;
尝试
{
StorageFolder drive=Task.Run(async()=>wait-StorageFolder.GetFolderFromPathAsync(driveLetter+“:”)。结果;
驱动器。添加(驱动器);
}
catch(System.aggregateeexception){}
}
返回驱动器;
}
这是呼叫代码:

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);
}
List drives=GetInternalDrives();
panScanParams.Children.Clear();
foreach(驱动器中的StorageFolder驱动器)
{
复选框cb=新复选框();
cb.Content=drive.DisplayName;
cb.IsChecked=true;
panScanParams.Children.Add(cb);
}

虽然代码可以工作,但调用参数不正确的方法并处理异常并不是一种好的做法。但是由于缺乏合适的替代方案,我不知道还有什么其他选择。

但是如果我需要获得有关系统驱动器(可用空间/最大空间)等的信息,我如何获得这些信息?如果你想找到可用空间,你可以试着使用,虽然您必须注意检查空间的位置-例如MusicLibrary可以同时位于phone/sd等。@Romasz是正确的,但仅供参考,您可以列出可移动存储(即USB驱动器)-请参见我的回答