Sdílet prostřednictvím


Zprostředkovatelé souborů v ASP.NET Core

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Autor: Steve Smith

ASP.NET Core abstrahuje přístup k systému souborů prostřednictvím použití zprostředkovatelů souborů. Zprostředkovatelé souborů se používají v rámci architektury ASP.NET Core. Příklad:

  • IWebHostEnvironmentzveřejňuje kořen obsahu aplikace a kořenový adresář webu jako IFileProvider typy.
  • Middleware statického souboru používá k vyhledání statických souborů zprostředkovatele souborů.
  • Razor používá zprostředkovatele souborů k vyhledání stránek a zobrazení.
  • Nástroje .NET Core používají k určení souborů, které se mají publikovat, pomocí zprostředkovatelů souborů a vzorů globu.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Rozhraní zprostředkovatele souborů

Primární rozhraní je IFileProvider. IFileProvider zveřejňuje metody pro:

IFileInfo poskytuje metody a vlastnosti pro práci se soubory:

Ze souboru můžete číst pomocí IFileInfo.CreateReadStream metody.

Ukázková FileProviderSample aplikace ukazuje, jak nakonfigurovat zprostředkovatele Startup.ConfigureServices souborů pro použití v celé aplikaci prostřednictvím injektáže závislostí.

Implementace zprostředkovatele souborů

Následující tabulka uvádí implementace .IFileProvider

Implementace Popis
Zprostředkovatel složených souborů Používá se k poskytování kombinovaného přístupu k souborům a adresářům od jednoho nebo více jiných poskytovatelů.
Zprostředkovatel souborů Manifest Embedded Používá se pro přístup k souborům vloženým do sestavení.
Zprostředkovatel fyzických souborů Používá se pro přístup k fyzickým souborům systému.

Zprostředkovatel fyzických souborů

Poskytuje PhysicalFileProvider přístup k fyzickému systému souborů. PhysicalFileProviderSystem.IO.File používá typ (pro fyzického zprostředkovatele) a definuje všechny cesty k adresáři a jeho podřízeným položkám. Toto určení rozsahu brání přístupu k systému souborů mimo zadaný adresář a jeho podřízené položky. Nejběžnějším scénářem vytvoření a použití objektu PhysicalFileProvider je vyžádání IFileProvider v konstruktoru prostřednictvím injektáže závislostí.

Při přímé instanci tohoto poskytovatele se vyžaduje absolutní cesta k adresáři a slouží jako základní cesta pro všechny požadavky provedené pomocí zprostředkovatele. V cestě k adresáři nejsou podporovány vzory globu.

Následující kód ukazuje, jak získat PhysicalFileProvider obsah adresáře a informace o souborech:

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

Typy v předchozím příkladu:

  • providerje .IFileProvider
  • contentsje .IDirectoryContents
  • fileInfoje .IFileInfo

Zprostředkovatel souborů lze použít k iteraci v adresáři určeném applicationRoot pomocí nebo volání GetFileInfo k získání informací o souboru. Vzory globu nelze metodě předat GetFileInfo . Zprostředkovatel souborů nemá přístup mimo applicationRoot adresář.

Ukázková FileProviderSample aplikace vytvoří zprostředkovatele v Startup.ConfigureServices metodě pomocí IHostEnvironment.ContentRootFileProvider:

var physicalProvider = _env.ContentRootFileProvider;

Zprostředkovatel souborů Manifest Embedded

Slouží ManifestEmbeddedFileProvider k přístupu k souborům vloženým v sestaveních. Pomocí ManifestEmbeddedFileProvider manifestu zkompilovaného do sestavení rekonstruuje původní cesty vložených souborů.

Generování manifestu vložených souborů:

  1. Přidejte do Microsoft.Extensions.FileProviders.Embedded projektu balíček NuGet.

  2. Nastavte vlastnost <GenerateEmbeddedFilesManifest> na true. Zadejte soubory, které chcete vložit:<EmbeddedResource>

    <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>
    

Pomocí vzorů globu můžete zadat jeden nebo více souborů pro vložení do sestavení.

Ukázková FileProviderSample aplikace vytvoří ManifestEmbeddedFileProvider a předá aktuálně spuštěné sestavení jeho konstruktoru.

Startup.cs:

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

Další přetížení vám umožní:

  • Zadejte relativní cestu k souboru.
  • Nastavení rozsahu souborů na datum poslední změny
  • Pojmenujte vložený prostředek obsahující manifest vloženého souboru.
Přetížit Popis
ManifestEmbeddedFileProvider(Assembly, String) Přijímá volitelný root parametr relativní cesty. root Zadejte rozsah volání těchto GetDirectoryContents prostředků v zadané cestě.
ManifestEmbeddedFileProvider(Assembly, String, DateTimeOffset) Přijímá volitelný root parametr relativní cesty a lastModified parametr date (DateTimeOffset). Datum lastModified určuje datum poslední změny pro IFileInfo instance vrácené IFileProvidersadou .
ManifestEmbeddedFileProvider(Assembly, String, String, DateTimeOffset) Přijímá volitelnou root relativní cestu, lastModified datum a manifestName parametry. Představuje manifestName název vloženého prostředku obsahujícího manifest.

Zprostředkovatel složených souborů

IFileProvider Kombinuje CompositeFileProvider instance a zpřístupňuje jedno rozhraní pro práci se soubory z více poskytovatelů. Při vytváření CompositeFileProviderpředejte jednu nebo více IFileProvider instancí jeho konstruktoru.

V ukázkové FileProviderSample aplikaci PhysicalFileProvider a ManifestEmbeddedFileProvider zadejte soubory zaregistrované CompositeFileProvider v kontejneru služby aplikace. V metodě projektu Startup.ConfigureServices se nachází následující kód:

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

services.AddSingleton<IFileProvider>(compositeProvider);

Sledujte změny

Tato IFileProvider.Watch metoda poskytuje scénář sledování změn jednoho nebo více souborů nebo adresářů. Metoda Watch:

  • Přijímá řetězec cesty k souboru, který může k určení více souborů použít vzory globu .
  • Vrátí hodnotu IChangeToken.

Výsledný token změny zveřejňuje:

  • HasChanged: Vlastnost, kterou lze zkontrolovat a zjistit, zda došlo ke změně.
  • RegisterChangeCallback: Volá se při zjištění změn v zadaném řetězci cesty. Každý token změny volá pouze přidružené zpětné volání v reakci na jednu změnu. Pokud chcete povolit konstantní monitorování, použijte TaskCompletionSource<TResult> (viz níže) nebo znovu vytvořte IChangeToken instance v reakci na změny.

Ukázková WatchConsole aplikace zapíše zprávu při každé .txt změně souboru v TextFiles adresáři:

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

Některé systémy souborů, jako jsou kontejnery Dockeru a sdílené síťové složky, nemusí spolehlivě odesílat oznámení o změnách. Nastavte proměnnou DOTNET_USE_POLLING_FILE_WATCHER prostředí na 1 souborový systém nebo true ho dotazujte na změny každých čtyři sekundy (nedají se konfigurovat).

Vzory globů

Cesty k systému souborů používají vzory zástupných znaků označované jako glob (nebo globbing). Zadejte skupiny souborů s těmito vzory. Dva zástupné znaky jsou * a **:

*
Odpovídá všemu na aktuální úrovni složky, libovolnému názvu souboru nebo jakékoli příponě souboru. Shody jsou ukončeny / a . znaky v cestě k souboru.

**
Odpovídá všemu na více úrovních adresáře. Dá se použít k rekurzivnímu párování mnoha souborů v hierarchii adresářů.

Následující tabulka obsahuje běžné příklady vzorů globů.

Vzor Popis
directory/file.txt Odpovídá určitému souboru v určitém adresáři.
directory/*.txt Odpovídá všem souborům s příponou .txt v určitém adresáři.
directory/*/appsettings.json Odpovídá všem appsettings.json souborům v adresářích přesně o jednu úroveň pod složkou directory .
directory/**/*.txt Odpovídá všem souborům s příponou .txt , která se nachází kdekoli pod složkou directory .

ASP.NET Core abstrahuje přístup k systému souborů prostřednictvím použití zprostředkovatelů souborů. Zprostředkovatelé souborů se používají v rámci architektury ASP.NET Core:

  • IHostingEnvironmentzveřejňuje kořen obsahu aplikace a kořenový adresář webu jako IFileProvider typy.
  • Middleware statického souboru používá k vyhledání statických souborů zprostředkovatele souborů.
  • Razor používá zprostředkovatele souborů k vyhledání stránek a zobrazení.
  • Nástroje .NET Core používají k určení souborů, které se mají publikovat, pomocí zprostředkovatelů souborů a vzorů globu.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Rozhraní zprostředkovatele souborů

Primární rozhraní je IFileProvider. IFileProvider zveřejňuje metody pro:

IFileInfo poskytuje metody a vlastnosti pro práci se soubory:

Ze souboru můžete číst pomocí metody IFileInfo.CreateReadStream .

Ukázková aplikace ukazuje, jak nakonfigurovat zprostředkovatele Startup.ConfigureServices souborů pro použití v celé aplikaci prostřednictvím injektáže závislostí.

Implementace zprostředkovatele souborů

K dispozici jsou tři implementace IFileProvider .

Implementace Popis
PhysicalFileProvider Fyzický poskytovatel se používá pro přístup k fyzickým souborům systému.
ManifestEmbeddedFileProvider Zprostředkovatel manifestu Embedded slouží k přístupu k souborům vloženým do sestavení.
CompositeFileProvider Složený zprostředkovatel slouží k poskytování kombinovaného přístupu k souborům a adresářům od jednoho nebo více jiných poskytovatelů.

PhysicalFileProvider

Poskytuje PhysicalFileProvider přístup k fyzickému systému souborů. PhysicalFileProviderSystem.IO.File používá typ (pro fyzického zprostředkovatele) a definuje všechny cesty k adresáři a jeho podřízeným položkám. Toto určení rozsahu brání přístupu k systému souborů mimo zadaný adresář a jeho podřízené položky. Nejběžnějším scénářem vytvoření a použití objektu PhysicalFileProvider je vyžádání IFileProvider v konstruktoru prostřednictvím injektáže závislostí.

Při přímé instanci tohoto poskytovatele se vyžaduje cesta k adresáři a slouží jako základní cesta pro všechny požadavky provedené pomocí zprostředkovatele.

Následující kód ukazuje, jak vytvořit PhysicalFileProvider a použít ho k získání obsahu adresáře a informací o souborech:

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

Typy v předchozím příkladu:

  • providerje .IFileProvider
  • contentsje .IDirectoryContents
  • fileInfoje .IFileInfo

Zprostředkovatel souborů lze použít k iteraci v adresáři určeném applicationRoot pomocí nebo volání GetFileInfo k získání informací o souboru. Zprostředkovatel souborů nemá přístup mimo applicationRoot adresář.

Ukázková aplikace vytvoří zprostředkovatele ve třídě aplikace Startup.ConfigureServices pomocí IHostingEnvironment.ContentRootFileProvider:

var physicalProvider = _env.ContentRootFileProvider;

ManifestEmbeddedFileProvider

Slouží ManifestEmbeddedFileProvider k přístupu k souborům vloženým v sestaveních. Pomocí ManifestEmbeddedFileProvider manifestu zkompilovaného do sestavení rekonstruuje původní cesty vložených souborů.

Chcete-li vygenerovat manifest vložených souborů, nastavte <GenerateEmbeddedFilesManifest> vlastnost na true. Zadejte soubory, které se mají vložit pomocí EmbeddedResource>:<

<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>

Pomocí vzorů globu můžete zadat jeden nebo více souborů pro vložení do sestavení.

Ukázková aplikace vytvoří ManifestEmbeddedFileProvider a předá aktuálně spuštěné sestavení jeho konstruktoru.

Startup.cs:

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

Další přetížení vám umožní:

  • Zadejte relativní cestu k souboru.
  • Nastavení rozsahu souborů na datum poslední změny
  • Pojmenujte vložený prostředek obsahující manifest vloženého souboru.
Přetížit Popis
ManifestEmbeddedFileProvider(Assembly, String) Přijímá volitelný root parametr relativní cesty. root Zadejte rozsah volání těchto GetDirectoryContents prostředků v zadané cestě.
ManifestEmbeddedFileProvider(Assembly, String, DateTimeOffset) Přijímá volitelný root parametr relativní cesty a lastModified parametr date (DateTimeOffset). Datum lastModified určuje datum poslední změny pro IFileInfo instance vrácené IFileProvidersadou .
ManifestEmbeddedFileProvider(Assembly, String, String, DateTimeOffset) Přijímá volitelnou root relativní cestu, lastModified datum a manifestName parametry. Představuje manifestName název vloženého prostředku obsahujícího manifest.

CompositeFileProvider

IFileProvider Kombinuje CompositeFileProvider instance a zpřístupňuje jedno rozhraní pro práci se soubory z více poskytovatelů. Při vytváření CompositeFileProviderpředejte jednu nebo více IFileProvider instancí jeho konstruktoru.

V ukázkové aplikaci zadejte PhysicalFileProvider ManifestEmbeddedFileProvider soubory zaregistrované CompositeFileProvider v kontejneru služby aplikace:

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

services.AddSingleton<IFileProvider>(compositeProvider);

Sledujte změny

Metoda IFileProvider.Watch poskytuje scénář sledování jednoho nebo více souborů nebo adresářů pro změny. Watch přijímá řetězec cesty, který může použít vzory globu k určení více souborů. Watch vrátí hodnotu IChangeToken. Token změny zveřejňuje:

  • HasChanged: Vlastnost, kterou lze zkontrolovat a zjistit, zda došlo ke změně.
  • RegisterChangeCallback: Volá se při zjištění změn v zadaném řetězci cesty. Každý token změny volá pouze přidružené zpětné volání v reakci na jednu změnu. Pokud chcete povolit konstantní monitorování, použijte TaskCompletionSource<TResult> (viz níže) nebo znovu vytvořte IChangeToken instance v reakci na změny.

V ukázkové aplikaci je konzolová aplikace WatchConsole nakonfigurovaná tak, aby zobrazovala zprávu při každé změně textového souboru:

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

Některé systémy souborů, jako jsou kontejnery Dockeru a sdílené síťové složky, nemusí spolehlivě odesílat oznámení o změnách. Nastavte proměnnou DOTNET_USE_POLLING_FILE_WATCHER prostředí na 1 souborový systém nebo true ho dotazujte na změny každých čtyři sekundy (nedají se konfigurovat).

Vzory globů

Cesty k systému souborů používají vzory zástupných znaků označované jako glob (nebo globbing). Zadejte skupiny souborů s těmito vzory. Dva zástupné znaky jsou * a **:

*
Odpovídá všemu na aktuální úrovni složky, libovolnému názvu souboru nebo jakékoli příponě souboru. Shody jsou ukončeny / a . znaky v cestě k souboru.

**
Odpovídá všemu na více úrovních adresáře. Dá se použít k rekurzivnímu párování mnoha souborů v hierarchii adresářů.

Příklady vzorů globů

directory/file.txt
Odpovídá určitému souboru v určitém adresáři.

directory/*.txt
Odpovídá všem souborům s příponou .txt v určitém adresáři.

directory/*/appsettings.json
Odpovídá všem appsettings.json souborům v adresářích přesně o jednu úroveň pod složkou adresáře .

directory/**/*.txt
Odpovídá všem souborům s příponou .txt nalezenou kdekoli pod složkou adresáře .