asp.net core fileprovider获取所有驱动器

时间:2017-09-18 07:52:07

标签: c# asp.net-core-2.0 .net-core-2.0

我想在asp.net core 2.0中使用IFileProvider(PhysicalFileProvider)获取所有驱动器。

是否需要额外使用?或者有任何一个例子吗?

问候 克里斯

2 个答案:

答案 0 :(得分:0)

您必须在REST API控制器和启动文件中使用命名空间Microsoft.Extensions.FileProviders;来使用实现PhysicalFileProvider接口的IFileProvider类。您可以使用GetDirectoryContents()方法迭代文件。

检查以下链接以获取从根目录中获取文件的详细示例

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/file-providers

http://www.c-sharpcorner.com/article/file-providers-in-asp-net-core/

https://www.codeproject.com/Articles/1204104/ASP-NET-Core-File-Providers

答案 1 :(得分:0)

IFileProvider假定您从单个根目录开始,据我所知.Net内核没有提供将所有驱动器分组在单个根目录下的直接方法。

PhysicalFileProvider本身由于相同的原因肯定无法正常工作。

因此,如果可能的话,我只会使用System.IO.DriveInfo来获取驱动器列表。 如果您需要可测试性,则可以将其包装在一个自定义类中,并为其定义一个接口,即:

interface IDriveInfo
{
    string[] GetDrives();
}

但是,如果由于现有抽象等原因,您确实需要使用IFileProvider, 您可以结合使用CompositeFileProviderSystem.IO.DriveInfo来实现所需的目标,如下所示:

public IFileProvider GetFileProvider()
{
    var drives = DriveInfo.GetDrives();
    List<IFileProvider> fileProviders = new List<IFileProvider>();
    foreach(var drive in drives)
    {
        if (drive.IsReady)
        {
            fileProviders.Add(new PhysicalFileProvider(drive.RootDirectory.ToString()));
        }
    }
    return new CompositeFileProvider(fileProviders.ToArray());
}

这仍然不会提供驱动器列表,但是您可以遍历GetDirectoryContents的结果来手动创建驱动器列表。

HashSet<string> drives = new HashSet<string>();
var fp = GetFileProvider();
foreach (var fileInfo in fp.GetDirectoryContents(""))
{
    var pos = fileInfo.PhysicalPath.IndexOf(':');
    var driveLetter =  fileInfo.PhysicalPath.Substring(0, pos+1);
    drives.Add(driveLetter);
}

我在.Net CORE 3.0上对此进行了测试,但是根据文档,它对于2.0版应该是相同的: https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.fileproviders.compositefileprovider?view=dotnet-plat-ext-2.0