IFileProvider
IFileProvider,抽象的文件系统,可以构建具有层次化的目录结构。
扩展包(NuGet):
Microsoft.Extensions.FileProviders.Abstractions
Microsoft.Extensions.FileProviders.Physical
Microsoft.Extensions.FileProviders.Embedded
用法示例一:
public class demo16
{
public static void test()
{
var provider = new ServiceCollection()
.AddSingleton<IFileProvider>(new PhysicalFileProvider(@"C:\Users\Administrator\Desktop\新建文件夹"))
//读取程序嵌入资源,参数为程序集.
//Assembly.GetExecutingAssembly()获取包含当前正在执行的代码的程序集
//.AddSingleton<IFileProvider>(new EmbeddedFileProvider(Assembly.GetExecutingAssembly()));
.AddSingleton<FileManage>()
.BuildServiceProvider();
var fileManager = provider.GetService<FileManage>();
fileManager.Dir();
}
public class FileManage
{
private readonly IFileProvider _fileProvider;
public FileManage(IFileProvider fileProvider)
{
_fileProvider = fileProvider;
}
public void Dir()
{
var index = -1;
Get("");
void Get(string subpath)
{
index++;
foreach (var fileinfo in _fileProvider.GetDirectoryContents(subpath)) {
Console.WriteLine(new string('\t',index)+fileinfo.Name);
if (fileinfo.IsDirectory)
{
Get($@"{subpath}\{fileinfo.Name}");
}
}
}
}
}
}
基本用法,只是读取文件名。
用法示例二:
public class Sample01
{
public static void test()
{
var provider = new ServiceCollection()
.AddSingleton<IFileProvider>(new PhysicalFileProvider(@"C:\Users\Administrator\Desktop\新建文件夹"))
.AddSingleton<FileManager>()
.BuildServiceProvider();
var fileManager = provider.GetService<FileManager>();
fileManager.WatchAsync("Text.txt").Wait();
Console.Read();
}
public class FileManager
{
private readonly IFileProvider _fileProvider;
public FileManager(IFileProvider fileProvider)
{
_fileProvider = fileProvider;
}
public async Task WatchAsync(string path)
{
Console.WriteLine(await ReadAsync(path));
ChangeToken.OnChange(() => _fileProvider.Watch(path), async () =>
{
Console.Clear();
Console.WriteLine(await ReadAsync(path));
});
}
public async Task<string> ReadAsync(string path)
{
await using var stream = _fileProvider.GetFileInfo(path).CreateReadStream();
var buffer = new byte[stream.Length];
await stream.ReadAsync(buffer, 0, buffer.Length);
return Encoding.Default.GetString(buffer);
}
}
}
监控文件变化,当文件内容改变时会自动发送通知。
让我们来看一下IFileProvider源码。
位置:runtime\src\libraries\Microsoft.Extensions.FileProviders.Abstractions\src\IFileProvider.cs
代码:
namespace Microsoft.Extensions.FileProviders
{
/// <summary>
/// A read-only file provider abstraction.
/// </summary>
public interface IFilePro