Aracılığıyla paylaş


ASP.NET Core'da Dosya Sağlayıcıları

Tarafından Steve Smith

ASP.NET Core, Dosya Sağlayıcıları'nın kullanımı aracılığıyla dosya sistemi erişimini soyutlar. Dosya Sağlayıcıları ASP.NET Core çerçevesi boyunca kullanılır. Örnek:

  • IWebHostEnvironmentuygulamanın içerik kökünü ve web kökünü tür olarak IFileProvider kullanıma sunar.
  • Statik Dosya Ara Yazılımı , statik dosyaları bulmak için Dosya Sağlayıcıları'nı kullanır.
  • Razor , sayfaları ve görünümleri bulmak için Dosya Sağlayıcıları'na sahiptir.
  • .NET Core araçları, hangi dosyaların yayımlanması gerektiğini belirtmek için Dosya Sağlayıcıları ve glob desenlerini kullanır.

Örnek kodu görüntüleme veya indirme (indirme)

Dosya Sağlayıcısı arabirimleri

Birincil arabirim şeklindedir IFileProvider. IFileProvider yöntemleri şu şekilde kullanıma sunar:

IFileInfo dosyalarla çalışmak için yöntemler ve özellikler sağlar:

yöntemini kullanarak dosyasından IFileInfo.CreateReadStream okuyabilirsiniz.

Örnek FileProviderSample uygulama, içinde bir Dosya Sağlayıcısı'nı Startup.ConfigureServices bağımlılık ekleme yoluyla uygulama genelinde kullanmak üzere yapılandırmayı gösterir.

Dosya Sağlayıcısı uygulamaları

Aşağıdaki tabloda uygulamalarını listelemektedir IFileProvider.

Uygulama Tanım
Bileşik Dosya Sağlayıcısı Bir veya daha fazla sağlayıcıdan dosyalara ve dizinlere birleşik erişim sağlamak için kullanılır.
Bildirim Eklenmiş Dosya Sağlayıcısı Derlemelere eklenmiş dosyalara erişmek için kullanılır.
Fiziksel Dosya Sağlayıcısı Sistemin fiziksel dosyalarına erişmek için kullanılır.

Fiziksel Dosya Sağlayıcısı

, PhysicalFileProvider fiziksel dosya sistemine erişim sağlar. PhysicalFileProviderSystem.IO.File türünü (fiziksel sağlayıcı için) kullanır ve bir dizinin ve alt öğelerinin tüm yollarının kapsamını belirler. Bu kapsam belirleme, belirtilen dizinin ve alt öğelerinin dışındaki dosya sistemine erişimi engeller. oluşturma ve kullanma PhysicalFileProvider için en yaygın senaryo, bağımlılık ekleme yoluyla bir oluşturucuda istekte IFileProvider bulunmaktır.

Bu sağlayıcının örneğini doğrudan oluştururken mutlak bir dizin yolu gerekir ve sağlayıcı kullanılarak yapılan tüm istekler için temel yol olarak görev yapar. Glob desenleri dizin yolunda desteklenmez.

Aşağıdaki kod, dizin içeriğini ve dosya bilgilerini almak için nasıl kullanılacağını PhysicalFileProvider gösterir:

var provider = new PhysicalFileProvider(applicationRoot);
var contents = provider.GetDirectoryContents(string.Empty);
var filePath = Path.Combine("wwwroot", "js", "site.js");
var fileInfo = provider.GetFileInfo(filePath);

Yukarıdaki örnekteki türler:

  • provider bir IFileProvider...
  • contents bir IDirectoryContents...
  • fileInfo bir IFileInfo...

Dosya Sağlayıcısı, tarafından applicationRoot belirtilen dizinde yinelemek veya bir dosyanın bilgilerini almak için çağrısı GetFileInfo yapmak için kullanılabilir. Glob desenleri yöntemine GetFileInfo geçirilemiyor. Dosya Sağlayıcısı'nın dizin dışında applicationRoot erişimi yok.

Örnek FileProviderSample uygulama yöntemini kullanarak IHostEnvironment.ContentRootFileProvidersağlayıcıyı Startup.ConfigureServices oluşturur:

var physicalProvider = _env.ContentRootFileProvider;

Bildirim Eklenmiş Dosya Sağlayıcısı

ManifestEmbeddedFileProvider, derlemelere eklenmiş dosyalara erişmek için kullanılır. , ManifestEmbeddedFileProvider katıştırılmış dosyaların özgün yollarını yeniden oluşturmak için derlemede derlenmiş bir bildirim kullanır.

Eklenmiş dosyaların bildirimini oluşturmak için:

  1. Microsoft.Extensions.FileProviders.Embedded NuGet paketini projenize ekleyin.

  2. <GenerateEmbeddedFilesManifest> özelliğini true olarak ayarlayın. ile <EmbeddedResource>eklenecek dosyaları belirtin:

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.0" />
      </ItemGroup>
    
      <ItemGroup>
        <EmbeddedResource Include="Resource.txt" />
      </ItemGroup>
    
    </Project>
    

Derlemeye eklenecek bir veya daha fazla dosya belirtmek için glob desenlerini kullanın.

Örnek FileProviderSample uygulama bir ManifestEmbeddedFileProvider oluşturur ve şu anda yürütülmekte olan derlemeyi oluşturucusna geçirir.

Startup.cs:

var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);

Ek aşırı yüklemeler şunları yapmanızı sağlar:

  • Göreli bir dosya yolu belirtin.
  • Dosyaların son değiştirme tarihine kadar kapsam dosyaları.
  • Katıştırılmış dosya bildirimini içeren ekli kaynağı adlandırın.
Aşırı Tanım
ManifestEmbeddedFileProvider(Assembly, String) İsteğe bağlı root göreli yol parametresini kabul eder. root Sağlanan yol altındaki bu kaynaklara GetDirectoryContents yapılan kapsam çağrılarını belirtin.
ManifestEmbeddedFileProvider(Assembly, String, DateTimeOffset) İsteğe bağlı root göreli yol parametresini ve lastModified tarih (DateTimeOffset) parametresini kabul eder. Tarih, lastModified tarafından döndürülen örnekler için IFileInfo son değişiklik tarihini kapsamlar IFileProvider.
ManifestEmbeddedFileProvider(Assembly, String, String, DateTimeOffset) İsteğe bağlı root göreli yolu, lastModified tarihi ve manifestName parametreleri kabul eder. , manifestName bildirimi içeren eklenmiş kaynağın adını temsil eder.

Bileşik Dosya Sağlayıcısı

birden CompositeFileProvider çok sağlayıcının dosyalarıyla çalışmak için tek bir arabirimi ortaya çıkararak örnekleri birleştirir IFileProvider . oluştururken CompositeFileProvider, oluşturucusunun bir veya daha fazla IFileProvider örneğini geçirin.

FileProviderSample Örnek uygulamada, ve PhysicalFileProvider veManifestEmbeddedFileProvider, uygulamanın hizmet kapsayıcısında kayıtlı bir CompositeFileProvider dosya sağlar. Projenin yönteminde Startup.ConfigureServices aşağıdaki kod bulunur:

var physicalProvider = _env.ContentRootFileProvider;
var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);
var compositeProvider = 
    new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);

services.AddSingleton<IFileProvider>(compositeProvider);

Değişiklikleri izleyin

yöntemi, IFileProvider.Watch değişiklikler için bir veya daha fazla dosya veya dizin izlemek için bir senaryo sağlar. Watch yöntemi:

Sonuçta elde edilen değişiklik belirteci aşağıdakileri kullanıma sunar:

  • HasChanged: Değişiklik olup olmadığını belirlemek için denetlenebilen bir özellik.
  • RegisterChangeCallback: Belirtilen yol dizesinde değişiklikler algılandığında çağrılır. Her değişiklik belirteci yalnızca tek bir değişikliğe yanıt olarak ilişkili geri çağırmayı çağırır. Sürekli izlemeyi etkinleştirmek için bir (aşağıda gösterilmiştir) kullanın TaskCompletionSource<TResult> veya değişikliklere yanıt olarak örnekleri yeniden oluşturun IChangeToken .

Örnek WatchConsole uygulama, dizindeki TextFiles bir dosya her değiştirildiğinde bir .txt ileti yazar:

private static readonly string _fileFilter = Path.Combine("TextFiles", "*.txt");

public static void Main(string[] args)
{
    Console.WriteLine($"Monitoring for changes with filter '{_fileFilter}' (Ctrl + C to quit)...");

    while (true)
    {
        MainAsync().GetAwaiter().GetResult();
    }
}

private static async Task MainAsync()
{
    var fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
    IChangeToken token = fileProvider.Watch(_fileFilter);
    var tcs = new TaskCompletionSource<object>();

    token.RegisterChangeCallback(state =>
        ((TaskCompletionSource<object>)state).TrySetResult(null), tcs);

    await tcs.Task.ConfigureAwait(false);

    Console.WriteLine("file changed");
}

Docker kapsayıcıları ve ağ paylaşımları gibi bazı dosya sistemleri güvenilir bir şekilde değişiklik bildirimleri göndermeyebilir. Ortam değişkenini DOTNET_USE_POLLING_FILE_WATCHER1 olarak ayarlayın veya true dosya sistemini her dört saniyede bir yapılan değişiklikler için yoklayın (yapılandırılamaz).

Glob desenleri

Dosya sistemi yolları glob (veya globbing) desenleri olarak adlandırılan joker karakter desenleri kullanır. Bu desenlere sahip dosya gruplarını belirtin. İki joker karakter şunlardır*:**

*
Geçerli klasör düzeyindeki herhangi bir öğeyle, herhangi bir dosya adıyla veya herhangi bir dosya uzantısıyla eşleşir. Eşleşmeler ve . dosya yolundaki karakterler tarafından / sonlandırılır.

**
Birden çok dizin düzeyindeki her şeyle eşleşir. Dizin hiyerarşisi içindeki birçok dosyayı özyinelemeli olarak eşleştirmek için kullanılabilir.

Aşağıdaki tabloda glob desenlerinin yaygın örnekleri verilmiştir.

Desen Tanım
directory/file.txt Belirli bir dizindeki belirli bir dosyayla eşleşir.
directory/*.txt Belirli bir dizindeki uzantıya sahip .txt tüm dosyaları eşleştirir.
directory/*/appsettings.json Dizinlerdeki tüm appsettings.json dosyaları klasörün tam olarak bir düzeyi altında eşleştirir directory .
directory/**/*.txt Klasörün herhangi bir yerinde bulunan bir .txt uzantıya sahip tüm dosyaları eşleştirir directory .

ASP.NET Core, Dosya Sağlayıcıları'nın kullanımı aracılığıyla dosya sistemi erişimini soyutlar. Dosya Sağlayıcıları ASP.NET Core çerçevesi boyunca kullanılır:

  • IHostingEnvironmentuygulamanın içerik kökünü ve web kökünü tür olarak IFileProvider kullanıma sunar.
  • Statik Dosya Ara Yazılımı , statik dosyaları bulmak için Dosya Sağlayıcıları'nı kullanır.
  • Razor , sayfaları ve görünümleri bulmak için Dosya Sağlayıcıları'na sahiptir.
  • .NET Core araçları, hangi dosyaların yayımlanması gerektiğini belirtmek için Dosya Sağlayıcıları ve glob desenlerini kullanır.

Örnek kodu görüntüleme veya indirme (indirme)

Dosya Sağlayıcısı arabirimleri

Birincil arabirim şeklindedir IFileProvider. IFileProvider yöntemleri şu şekilde kullanıma sunar:

IFileInfo dosyalarla çalışmak için yöntemler ve özellikler sağlar:

IFileInfo.CreateReadStream yöntemini kullanarak dosyasından okuyabilirsiniz.

Örnek uygulama, içinde bir Dosya Sağlayıcısı'nı Startup.ConfigureServices bağımlılık ekleme yoluyla uygulama genelinde kullanmak üzere yapılandırmayı gösterir.

Dosya Sağlayıcısı uygulamaları

üç uygulaması IFileProvider kullanılabilir.

Uygulama Tanım
PhysicalFileProvider Fiziksel sağlayıcı, sistemin fiziksel dosyalarına erişmek için kullanılır.
ManifestEmbeddedFileProvider Bildirim eklenmiş sağlayıcı, derlemelere katıştırılmış dosyalara erişmek için kullanılır.
CompositeFileProvider Bileşik sağlayıcı, bir veya daha fazla sağlayıcıdan dosyalara ve dizinlere birleşik erişim sağlamak için kullanılır.

PhysicalFileProvider

, PhysicalFileProvider fiziksel dosya sistemine erişim sağlar. PhysicalFileProviderSystem.IO.File türünü (fiziksel sağlayıcı için) kullanır ve bir dizinin ve alt öğelerinin tüm yollarının kapsamını belirler. Bu kapsam belirleme, belirtilen dizinin ve alt öğelerinin dışındaki dosya sistemine erişimi engeller. oluşturma ve kullanma PhysicalFileProvider için en yaygın senaryo, bağımlılık ekleme yoluyla bir oluşturucuda istekte IFileProvider bulunmaktır.

Bu sağlayıcının örneğini doğrudan oluştururken bir dizin yolu gerekir ve sağlayıcı kullanılarak yapılan tüm istekler için temel yol olarak görev yapar.

Aşağıdaki kod, dizin içeriğini ve dosya bilgilerini almak için nasıl PhysicalFileProvider oluşturulacağını ve kullanılacağını gösterir:

var provider = new PhysicalFileProvider(applicationRoot);
var contents = provider.GetDirectoryContents(string.Empty);
var fileInfo = provider.GetFileInfo("wwwroot/js/site.js");

Yukarıdaki örnekteki türler:

  • provider bir IFileProvider...
  • contents bir IDirectoryContents...
  • fileInfo bir IFileInfo...

Dosya Sağlayıcısı, tarafından applicationRoot belirtilen dizinde yinelemek veya bir dosyanın bilgilerini almak için çağrısı GetFileInfo yapmak için kullanılabilir. Dosya Sağlayıcısı'nın dizin dışında applicationRoot erişimi yok.

Örnek uygulama, IHostingEnvironment.ContentRootFileProvider kullanarak uygulamanın Startup.ConfigureServices sınıfında sağlayıcıyı oluşturur:

var physicalProvider = _env.ContentRootFileProvider;

ManifestEmbeddedFileProvider

ManifestEmbeddedFileProvider, derlemelere eklenmiş dosyalara erişmek için kullanılır. , ManifestEmbeddedFileProvider katıştırılmış dosyaların özgün yollarını yeniden oluşturmak için derlemede derlenmiş bir bildirim kullanır.

Katıştırılmış dosyaların bildirimini oluşturmak için özelliğini olarak trueayarlayın<GenerateEmbeddedFilesManifest>. EmbeddedResource> ile <eklenecek dosyaları belirtin:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="Resource.txt" />
  </ItemGroup>

</Project>

Derlemeye eklenecek bir veya daha fazla dosya belirtmek için glob desenlerini kullanın.

Örnek uygulama bir ManifestEmbeddedFileProvider oluşturur ve şu anda yürütülmekte olan derlemeyi oluşturucusna geçirir.

Startup.cs:

var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);

Ek aşırı yüklemeler şunları yapmanızı sağlar:

  • Göreli bir dosya yolu belirtin.
  • Dosyaların son değiştirme tarihine kadar kapsam dosyaları.
  • Katıştırılmış dosya bildirimini içeren ekli kaynağı adlandırın.
Aşırı Tanım
ManifestEmbeddedFileProvider(Assembly, String) İsteğe bağlı root göreli yol parametresini kabul eder. root Sağlanan yol altındaki bu kaynaklara GetDirectoryContents yapılan kapsam çağrılarını belirtin.
ManifestEmbeddedFileProvider(Assembly, String, DateTimeOffset) İsteğe bağlı root göreli yol parametresini ve lastModified tarih (DateTimeOffset) parametresini kabul eder. Tarih, lastModified tarafından döndürülen örnekler için IFileInfo son değişiklik tarihini kapsamlar IFileProvider.
ManifestEmbeddedFileProvider(Assembly, String, String, DateTimeOffset) İsteğe bağlı root göreli yolu, lastModified tarihi ve manifestName parametreleri kabul eder. , manifestName bildirimi içeren eklenmiş kaynağın adını temsil eder.

CompositeFileProvider

birden CompositeFileProvider çok sağlayıcının dosyalarıyla çalışmak için tek bir arabirimi ortaya çıkararak örnekleri birleştirir IFileProvider . oluştururken CompositeFileProvider, oluşturucusunun bir veya daha fazla IFileProvider örneğini geçirin.

Örnek uygulamada a PhysicalFileProvider ve ManifestEmbeddedFileProvider , uygulamanın hizmet kapsayıcısında kayıtlı bir CompositeFileProvider dosya sağlar:

var physicalProvider = _env.ContentRootFileProvider;
var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);
var compositeProvider = 
    new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);

services.AddSingleton<IFileProvider>(compositeProvider);

Değişiklikleri izleyin

IFileProvider.Watch yöntemi, değişiklikler için bir veya daha fazla dosya veya dizin izlemeye yönelik bir senaryo sağlar. Watchbirden çok dosya belirtmek için glob desenlerini kullanabilen bir yol dizesi kabul eder. Watch döndürür IChangeToken. Değişiklik belirteci aşağıdakileri kullanıma sunar:

  • HasChanged: Değişiklik olup olmadığını belirlemek için denetlenebilen bir özellik.
  • RegisterChangeCallback: Belirtilen yol dizesinde değişiklikler algılandığında çağrılır. Her değişiklik belirteci yalnızca tek bir değişikliğe yanıt olarak ilişkili geri çağırmayı çağırır. Sürekli izlemeyi etkinleştirmek için bir (aşağıda gösterilmiştir) kullanın TaskCompletionSource<TResult> veya değişikliklere yanıt olarak örnekleri yeniden oluşturun IChangeToken .

Örnek uygulamada WatchConsole konsol uygulaması, bir metin dosyası her değiştirildiğinde iletiyi görüntüleyecek şekilde yapılandırılır:

private static PhysicalFileProvider _fileProvider = 
    new PhysicalFileProvider(Directory.GetCurrentDirectory());

public static void Main(string[] args)
{
    Console.WriteLine("Monitoring quotes.txt for changes (Ctrl-c to quit)...");

    while (true)
    {
        MainAsync().GetAwaiter().GetResult();
    }
}

private static async Task MainAsync()
{
    IChangeToken token = _fileProvider.Watch("quotes.txt");
    var tcs = new TaskCompletionSource<object>();

    token.RegisterChangeCallback(state => 
        ((TaskCompletionSource<object>)state).TrySetResult(null), tcs);

    await tcs.Task.ConfigureAwait(false);

    Console.WriteLine("quotes.txt changed");
}

Docker kapsayıcıları ve ağ paylaşımları gibi bazı dosya sistemleri güvenilir bir şekilde değişiklik bildirimleri göndermeyebilir. Ortam değişkenini DOTNET_USE_POLLING_FILE_WATCHER1 olarak ayarlayın veya true dosya sistemini her dört saniyede bir yapılan değişiklikler için yoklayın (yapılandırılamaz).

Glob desenleri

Dosya sistemi yolları glob (veya globbing) desenleri olarak adlandırılan joker karakter desenleri kullanır. Bu desenlere sahip dosya gruplarını belirtin. İki joker karakter şunlardır*:**

*
Geçerli klasör düzeyindeki herhangi bir öğeyle, herhangi bir dosya adıyla veya herhangi bir dosya uzantısıyla eşleşir. Eşleşmeler ve . dosya yolundaki karakterler tarafından / sonlandırılır.

**
Birden çok dizin düzeyindeki her şeyle eşleşir. Dizin hiyerarşisi içindeki birçok dosyayı özyinelemeli olarak eşleştirmek için kullanılabilir.

Glob desen örnekleri

directory/file.txt
Belirli bir dizindeki belirli bir dosyayla eşleşir.

directory/*.txt
Belirli bir dizindeki .txt uzantısına sahip tüm dosyaları eşleştirir.

directory/*/appsettings.json
Dizinlerdeki tüm appsettings.json dosyaları dizin klasörünün tam olarak bir düzeyiyleeşleştirir.

directory/**/*.txt
Dizin klasörünün altında herhangi bir yerde bulunan .txt uzantısına sahip tüm dosyaları eşleştirir.