我想在asp.net core 2.0中使用IFileProvider(PhysicalFileProvider)获取所有驱动器。
是否需要额外使用?或者有任何一个例子吗?
问候 克里斯
答案 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
,
您可以结合使用CompositeFileProvider
和System.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