ASP.NET Core'da Dosya Sağlayıcıları
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
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. Örneğin:
- 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:
- Dosya bilgilerini (IFileInfo) alın.
- Dizin bilgilerini (IDirectoryContents) alın.
- Değişiklik bildirimlerini ayarlama (kullanarak IChangeToken).
IFileInfo
dosyalarla çalışmak için yöntemler ve özellikler sağlar:
- Exists
- IsDirectory
- Name
- Length (bayt cinsinden)
- LastModified tarih
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 | Açıklama |
---|---|
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. PhysicalFileProvider
System.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
birIFileProvider
...contents
birIDirectoryContents
...fileInfo
birIFileInfo
...
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:
Microsoft.Extensions.FileProviders.Embedded
NuGet paketini projenize ekleyin.<GenerateEmbeddedFilesManifest>
özelliğinitrue
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.
Fazla doldurma | Açıklama |
---|---|
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:
- Birden çok dosya belirtmek için glob desenleri kullanabilen bir dosya yolu dizesi kabul eder.
- bir IChangeTokendöndürür.
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_WATCHER
1
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 | Açıklama |
---|---|
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:
- Dosya bilgilerini (IFileInfo) alın.
- Dizin bilgilerini (IDirectoryContents) alın.
- Değişiklik bildirimlerini ayarlama (kullanarak IChangeToken).
IFileInfo
dosyalarla çalışmak için yöntemler ve özellikler sağlar:
- Exists
- IsDirectory
- Name
- Length (bayt cinsinden)
- LastModified tarih
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 | Açıklama |
---|---|
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. PhysicalFileProvider
System.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
birIFileProvider
...contents
birIDirectoryContents
...fileInfo
birIFileInfo
...
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 true
ayarlayı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.
Fazla doldurma | Açıklama |
---|---|
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. Watch
birden ç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_WATCHER
1
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ılı tüm dosyaları eşleştirir.
directory/*/appsettings.json
Dizinlerdeki tüm appsettings.json
dosyaları dizin klasörünün tam olarak bir düzeyiyle eşleştirir.
directory/**/*.txt
Dizin klasörünün herhangi bir yerinde bulunan .txt uzantılı tüm dosyaları eşleştirir.
ASP.NET Core