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); }