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:
- Získání informací o souboru (IFileInfo).
- Získání informací o adresáři (IDirectoryContents).
- Nastavení oznámení o změnách (pomocí funkce IChangeToken).
IFileInfo
poskytuje metody a vlastnosti pro práci se soubory:
- Exists
- IsDirectory
- Name
- Length (v bajtech)
- LastModified rande
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ů. PhysicalFileProvider
System.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:
provider
je .IFileProvider
contents
je .IDirectoryContents
fileInfo
je .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ů:
Přidejte do
Microsoft.Extensions.FileProviders.Embedded
projektu balíček NuGet.Nastavte vlastnost
<GenerateEmbeddedFilesManifest>
natrue
. 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í CompositeFileProvider
př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:
- Získání informací o souboru (IFileInfo).
- Získání informací o adresáři (IDirectoryContents).
- Nastavení oznámení o změnách (pomocí funkce IChangeToken).
IFileInfo
poskytuje metody a vlastnosti pro práci se soubory:
- Exists
- IsDirectory
- Name
- Length (v bajtech)
- LastModified rande
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ů. PhysicalFileProvider
System.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:
provider
je .IFileProvider
contents
je .IDirectoryContents
fileInfo
je .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í CompositeFileProvider
př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 .