如何在 ASP.Net Core 中使用 File Providers

ASP.Net Core 爲了便於獲取文件和文件夾信息,監視文件變更, 在文件系統中提供了一個抽象層:File Providers, 這篇文章將會討論如何使用 File Providers 。

File Provider 抽象層

file prodivers 實現了 IFileProvider 接口,它的實現子類大概有三塊: Physical,EmbeddedComposite ,同時這個接口提供了可用於獲取文件和文件夾的相關信息的方法,接口定義如下:


    public interface IFileProvider
    {
        IDirectoryContents GetDirectoryContents(string subpath);

        IFileInfo GetFileInfo(string subpath);

        IChangeToken Watch(string filter);
    }

如果要實現 更改通知,還需要用 IChangeToken 接口,代碼如下:


    public interface IChangeToken
    {
        bool ActiveChangeCallbacks { get; }

        bool HasChanged { get; }

        IDisposable RegisterChangeCallback(Action<object> callback, object state);
    }

下面是 IFileProvider 接口的三個具體實現及應用,羅列如下:

  • PhysicalFileProvider

用於對 物理文件 的訪問

  • EmbeddedFileProvider

用於對 程序集 內的文件訪問

  • CompositeFileProvider

實現前面兩者的混合訪問

使用 PhysicalFileProvider

要想在 ASP.Net Core 中演示 PhysicalFileProvider,首先將其注入到 ServiceCollection 容器中,如下代碼所示:


        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            IFileProvider physicalProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());

            services.AddSingleton<IFileProvider>(physicalProvider);
        }

注入到容器後,現在就可以在 Controller 使用依賴注入獲取實例了,如下代碼所示:


    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IFileProvider _fileProvider;

        public HomeController(ILogger<HomeController> logger, IFileProvider fileProvider)
        {
            _logger = logger;
            this._fileProvider = fileProvider;
        }
    }

下面在 Index 方法中使用 GetDirectoryContents() 來獲取當前項目文件夾下的所有文件,如下代碼所示:


        public IActionResult Index()
        {
            List<string> lst = new List<string>();
            var contents = _fileProvider.GetDirectoryContents("");

            foreach (IFileInfo fileInfo in contents)
            {
                lst.Add(fileInfo.Name);
            }

            return View();
        }

使用 EmbeddedFileProvider

顧名思義,它就是用來訪問注入到 程序集 中的文件,下面的代碼展示瞭如何將 EmbeddedFileProvider 注入到 ASP.Net Core 的容器中,如下代碼所示:


        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            IFileProvider embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly())
                ;
            services.AddSingleton<IFileProvider>(embeddedProvider);
        }

使用 CompositeFileProvider

看到 Composite 單詞,是不是想起了設計模式中的 組合模式,對的,這裏 CompositeFileProvider 也是類似的操作手法,它可以將一個或者多個的 EmbeddedFileProvider 和 PhysicalFileProvider 進行組合,進而合成一個  CompositeFileProvider 供上層進行訪問,如果有點懵的話,可參考如下代碼:


var physicalProvider = _env.ContentRootFileProvider;
var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());
var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider);

總的來說,你可以利用 File Providers 來獲取文件或文件夾的信息,同時也可以實現變更通知,如果想在 ASP.Net Core 中實現文件系統訪問,可以通過依賴注入的方式按需使用你的 File Provider。

譯文鏈接:https://www.infoworld.com/article/3307516/how-to-use-file-providers-in-aspnet-core.html


本文分享自微信公衆號 - 一線碼農聊技術(dotnetfly)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章