ASP.NET Core文件提供程序获取所有驱动器

3

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

是否需要额外使用某个工具?或者有人有相关示例吗?

祝好, Chris


如果你正在寻找一个例子,可以检查一下我的答案。 - Niladri
2个回答

1

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

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

https://learn.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
我知道这个,但显然没有办法访问硬盘。只能访问目录。 - Christian

1

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

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://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.fileproviders.compositefileprovider?view=dotnet-plat-ext-2.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接