.net core中的內嵌資源以及IFileProvider


IFileProvider 

命名空間在 Microsoft.Extensions.FileProviders。

這個接口主要有三個方法: GetDirectoryContents 列出虛擬路徑上的文件夾,GetFileInfo文件信息,可以使用CreateReadStream讀取相應的文件流。watch 監控文件更改,似乎是使用文件的修改日期訪問的。

這個接口可以自定義重寫,比如支持網絡路徑,數據庫路徑等等。

不過今天先記錄下.net core的內嵌資源。

內嵌資源:將資源文件在編譯的是嵌入.dll文件中。

.net core中內嵌資源很簡單,只需要在項目文件.csproj 

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
    <ItemGroup>
     <!--內嵌資源,多個文件用;分開。也支持通配符*.txt等。--> <EmbeddedResource Include="EmbeddedFiles\info.txt;EmbeddedFiles\date.txt" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" /> </ItemGroup> </Project>

內嵌資源是沒有目錄層級的,如果使用EmbeddedFileProvider處理這些資源,則默認情況下,路徑為基礎命名空間+.xxx.xx這樣的格式。比如上面的date.txt則為:EmbededFiles.date.txt。

如果使用Assembly的方法,則為:EmbeddedFileDemo.EmbeddedFiles.date.txt

下面的代碼展示了如何去讀取內部的信息。

            var assembly = typeof(Program).Assembly;

            // 讀取文件流。
            foreach (var item in assembly.GetManifestResourceNames())
            {
                using var stream = assembly.GetManifestResourceStream(item);
                using var streamReader = new StreamReader(stream);
                var content = streamReader.ReadToEnd();
                Console.WriteLine(content);
            }

            var embeddedFileProvider = new EmbeddedFileProvider(assembly, nameof(EmbeddedFileDemo));

            // 由於內嵌文件資源不存在目錄結果,只有使用空字符串和/才能獲取到文件,其他情況都將返回NotFoundDirectoryContents
            var files = embeddedFileProvider.GetDirectoryContents(string.Empty);
            if (files.Exists)
            {
                using var fileInfoList = files.GetEnumerator();
                while (fileInfoList.MoveNext())
                {
                    var stream = fileInfoList.Current.CreateReadStream();
                    ShowContent(stream);
                }
            }
            
        }

        private static void ShowContent(Stream stream)
        {
            using var streamReader = new StreamReader(stream);
            var content = streamReader.ReadToEnd();
            Console.WriteLine(content);
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM